Java Method declaration returning List Generics with reference
你能解释一下为什么第一个不起作用吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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); } } |
我以为
不,这不是一个重复的问题(至少与被链接的问题无关)。如果我真的定义了一个对象列表,当然我不希望它接受一个字符串列表。但这里我接受的是一个对象列表加上从对象扩展的对象列表,所以问题是为什么它在第一种情况下不接受字符串。
您可以这样调用方法:
1 |
无论如何,编译器需要知道您的
- 使用方法
getList2(String.class) 通过传入参数来指定。 - 使用方法
getList3() 声明本身使用通配符(? ,因此您不必指定T ,但您的列表不会被强类型化(它将接受扩展Object 的每个类)。