Java方法声明返回List Generics并引用

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);
    }

}

我以为getList1()是返回一个List类,从Object扩展而来,String是其中之一?

不,这不是一个重复的问题(至少与被链接的问题无关)。如果我真的定义了一个对象列表,当然我不希望它接受一个字符串列表。但这里我接受的是一个对象列表加上从对象扩展的对象列表,所以问题是为什么它在第一种情况下不接受字符串。