簡體   English   中英

創建泛型類列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM