【发布时间】:2017-12-29 16:28:49
【问题描述】:
你能解释一下为什么第一个不起作用吗?
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 就是其中之一?
不,这不是一个重复的问题(至少不是被链接的问题)。如果我真的定义了一个对象列表,当然我不希望它采用一个字符串列表。但是在这里我接受一个对象列表以及从对象扩展的对象,所以问题是为什么它在第一种情况下不接受字符串。
【问题讨论】:
-
因为编译器无法推断
T的类型,所以默认为Object。 -
我不同意这是重复的,因为我在问为什么
List<T extends Object>不接受List<String>。