[英]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泛型不變的部分但是究竟發生了什么?
能夠在javac 1.8.0_144
上使用-source 7 -target 7
javac 1.8.0_144
。
如果你只打算從列表中取出東西,那么有用的東西是使用? extends Class<?>
? 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)
返回的類型list(T t)
是否依賴於T
有一個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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.