创建一个通用类列表

Mar*_*tus 3 java generics java-7

我有一个实用程序方法,可以从某些对象中创建一个元素列表:

public static final <T> List<T> list(T t) {
    final List<T> rv = new ArrayList<>();
    rv.add(t);
    return rv;
}
Run Code Online (Sandbox Code Playgroud)

我也有一个接受type参数的方法List<Class<?>>。因此,我必须创建该类型的对象。这是我尝试做的事情:

final Class<?> aClass = Integer.class;
final List<Class<?>> trivialListOfClasses = list(aClass);
Run Code Online (Sandbox Code Playgroud)

……这失败了:

[javac] /some/path/Foo.java:41: error: incompatible types
[javac]             final List<Class<?>> trivialListOfClasses = list(aClass);
[javac]                                                                  ^
[javac]   required: List<Class<?>>
[javac]   found:    List<Class<CAP#1>>
[javac]   where CAP#1 is a fresh type-variable:
[javac]     CAP#1 extends Object from capture of ?
[javac] 1 error
Run Code Online (Sandbox Code Playgroud)

完成上述任务的正确方法是什么?我了解有关Java泛型不变的部分,但是到底发生了什么?

Jor*_*nee 5

能够再现与-source 7 -target 7javac 1.8.0_144

如果您只打算将清单中的东西排除在外,则可以使用的一件事是使用? extends Class<?>

Class<?> aClass = Integer.class;
List<? extends Class<?>> trivialListOfClasses = list(aClass);
Class<?> bClass = trivialListOfClasses.get(0); // works
// trivialListOfClasses.add(String.class); // doesn't work, though
Run Code Online (Sandbox Code Playgroud)

也可以在以下调用中手动提供通用类型list

Class<?> aClass = Integer.class;
List<Class<?>> trivialListOfClasses = Util.<Class<?>>list(aClass);
Class<?> bClass = trivialListOfClasses.get(0); // works
trivialListOfClasses.add(String.class); // also works
Run Code Online (Sandbox Code Playgroud)

似乎编译器无法调和通配符类型List<Class<?>>与自己返回的通配符类型list