2017-12-28 32 views
2

ジェネリッククラスのリストを作成:私はいくつかのオブジェクトのうちの1要素のリストを作成するユーティリティメソッドを持つ

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); 

&hellip;これで失敗します:

[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ジェネリックが不変であることについては理解していますが、ここでは何が起こっていますか?

+2

なぜあなたは独自のバージョンのCollections.singletonList()を作成しましたか? – Kayaman

+3

解決策はあなたのJavaバージョンを更新することです、これは '1.8.0_144'でうまく動作します。 –

+0

私は 'Collections.singletonList(aClass)'とその前に 'Arrays.asList'を試みました。彼らはまだ同じエラーを出します。私は何が起こっているのか理解したかった。 –

答えて

4

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によって返されたものとList<Class<?>>のワイルドカード型を調整することができないようです。

+0

1+、通常はシンプルなものを提供* more *タイプ情報はこれらの種類を解決します謎の – Eugene

-2

ありそんなにわからないoracle javadoc i'amはどちらかですが、それは、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; 
} 
+0

でjavac 1.8.0_151を使用するとエラーが発生しません –

1
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

関連する問題