创建通用列表 类
create a list of generic classes
我有一个实用方法,可以从某个对象创建一个单元素列表:
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 泛型不变的部分,但这里到底发生了什么?
有一个 oracle javadoc 我不太确定,但它在 java 8 中有效。9 刚刚出来 ;)
public static void main(String [] args) throws Exception {
final Class<?> aClass = Integer.class;
final List<Class<?>> trivialListOfClasses = Program.list(aClass);
}
public static final <T> List<T> list(T t) {
final List<T> rv = new ArrayList<>();
rv.add(t);
return rv;
}
能够在 javac 1.8.0_144
上使用 -source 7 -target 7
进行复制。
如果你只是打算从列表中删除一些东西,一个有用的方法是使用 ? 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
还有一个方法是在对 list
:
的调用中手动提供通用类型
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<?>>
的通配符类型与 list
返回的通配符类型。
final List<Class<?>> trivialListOfClasses = list(aClass);
适用于 Java 1.8 和 9
final List<?> trivialList = list(aClass);
@SuppressWarnings("unchecked")
final List<Class<?>> trivialListOfClasses = (List<Class<?>>) trivialList;
是 1.7 的解决方法。似乎 1.7 编译器无法验证从 list(T t)
返回的类型是否依赖于 T
我有一个实用方法,可以从某个对象创建一个单元素列表:
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 泛型不变的部分,但这里到底发生了什么?
有一个 oracle javadoc 我不太确定,但它在 java 8 中有效。9 刚刚出来 ;)
public static void main(String [] args) throws Exception {
final Class<?> aClass = Integer.class;
final List<Class<?>> trivialListOfClasses = Program.list(aClass);
}
public static final <T> List<T> list(T t) {
final List<T> rv = new ArrayList<>();
rv.add(t);
return rv;
}
能够在 javac 1.8.0_144
上使用 -source 7 -target 7
进行复制。
如果你只是打算从列表中删除一些东西,一个有用的方法是使用 ? 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
还有一个方法是在对 list
:
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<?>>
的通配符类型与 list
返回的通配符类型。
final List<Class<?>> trivialListOfClasses = list(aClass);
适用于 Java 1.8 和 9
final List<?> trivialList = list(aClass);
@SuppressWarnings("unchecked")
final List<Class<?>> trivialListOfClasses = (List<Class<?>>) trivialList;
是 1.7 的解决方法。似乎 1.7 编译器无法验证从 list(T t)
返回的类型是否依赖于 T