java-创建泛型类列表
作者:互联网
我有一个实用程序方法,可以从某些对象中创建一个元素列表:
public static final <T> List<T> list(T t) {
final List<T> rv = new ArrayList<>();
rv.add(t);
return rv;
}
我也有一个接受类型为List< Class<?>>的参数的方法.因此,我必须创建该类型的对象.这是我尝试做的事情:
final Class<?> aClass = Integer.class;
final List<Class<?>> trivialListOfClasses = list(aClass);
……这失败了:
[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
完成上述任务的正确方法是什么?我了解有关Java泛型不变的部分,但是到底发生了什么?
解决方法:
能够在Javac 1.8.0_144上使用-source 7 -target 7进行复制.
如果您只打算从列表中删除东西,那么一件有用的事情就是使用?扩展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
也可以在列表调用中手动提供通用类型:
Class<?> aClass = Integer.class;
List<Class<?>> trivialListOfClasses = Util.<Class<?>>list(aClass);
Class<?> bClass = trivialListOfClasses.get(0); // works
trivialListOfClasses.add(String.class); // also works
似乎编译器无法调和List< Class<?>>的通配符类型.由列表本身返回的那个.
标签:generics,java-7,java 来源: https://codeday.me/bug/20191025/1928826.html