作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你能解释一下为什么第一个不起作用吗?
import java.util.ArrayList;
import java.util.List;
public class MyClass {
private <T extends Object> List<Class<T>> getList1() {
return new ArrayList<>();
}
private <T extends Object> List<Class<T>> getList2(Class<T> cls) {
List<Class<T>> list = new ArrayList<>();
list.add(cls);
return list;
}
private List<Class<? extends Object>> getList3() {
return new ArrayList<>();
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
// 1. Not OK - The method add(Class<Object>) in the type List<Class<Object>> is not applicable for the arguments (Class<String>)
myClass.getList1().add(String.class);
// 2. OK
myClass.getList2(String.class);
// 3. OK
myClass.getList3().add(String.class);
}
}
我认为 getList1()
返回的是从 Object
扩展的类的 List
,而 String
是其中之一?
不,这不是一个重复的问题(至少不是链接的问题)。如果我真的定义了一个对象列表,我当然不希望它接受一个字符串列表。但这里我接受一个对象列表加上那些从对象扩展的列表,所以问题是为什么它在第一种情况下不接受字符串。
最佳答案
您可以像这样调用该方法:
myClass.<String>getList1().add(String.class);
编译器需要以某种方式知道你的 T
是什么应该是( <String>
称为 type witness )。
getList2(String.class)
您可以通过传入参数来指定它。 getList3()
声明本身使用通配符 ( ?
),因此您不必指定 T
,但您的列表不会是强类型的(它将接受扩展 Object
的每个类)。 关于Java 方法声明返回带有引用的列表泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45274612/
我是一名优秀的程序员,十分优秀!