2017-12-18 6 views
-4

私はオブジェクトを(?)にキャストしようとしていますが、これを行う方法は? マイコード:ジェネリックスへの方法オブジェクトではありません

Map<T,?> rawResult = initMap; 
final T key = ... 
final Object kryoResult = kryo.readClassAndObject(input); 
rawResult.put(key,value); 

エラー

間違っ第二引数の型以下の私をもたらします。見つかった: 'java.lang.Object'、必須: '?'

キャストが動作しません:

(?)value 

をまた、この:

final ? value = ... 

はありませんか?オブジェクト?だから? "何でも...私は気にしない?"

+1

なぜ明らかな '地図'を使用したくないですか? – OldCurmudgeon

+0

"オブジェクトを(?)にキャストする:"(?) "がジェネリックで – anion

+0

クラスを作成し、マップのクラスのオブジェクトを使用するタイプではないため、キャストできません(?) 'class className { プライベートTt; マップ rawResult = initMap; } ' –

答えて

1

? "何でも...私は気にしない?"間違って

?は私がを気にしないではなくを知らないです。だからこそマップに何かを追加することはできません。マップにはStringオブジェクトも格納できるためです。したがって、Objectを追加するとエラーが発生します。

Map<T, String> stringMap = new HashMap<>(); 
stringMap.put(key, "Value"); 
Map<T, ?> map = stringMap; // works 
Object value = map.get(key); // Object, because "map" doesn't know the types its holding 
map.put(key, "New Value"); // doesn't work, even though the map is holding stringValues 

はまた、より詳細にワイルドカード?を説明this questionを見ています。

+1

@AndyTurner編集のおかげで、何とか完全にコピーされていない – Lino

-1

この場合、?(unknown type)を受け入れて、Object(known type)を挿入しようとすると、コンパイラはリストに挿入されているオブジェクトの種類を確認できず、エラーが発生します。

このようなエラーを取り除くには、ヘルパーメソッドを使用して型推論によってワイルドカードを取得できるようにする必要があります。マップに値を入れるための

Map<T, ?> map = new HashMap<>(); 
T key = ...; 
Object value = ...; 
putInMap(map, key, value); 

と方法:あなたがコレクションを反復処理か(バインドされない場合は、オブジェクト)の上部有界型にマップするとき

@SuppressWarnings("unchecked") 
<K, V> void putInMap(Map<K, V> map, K key, Object value) { 
    map.put(key, (V) value); 
} 

基本的には、?(unknown type)が使用されています。

https://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.htmlのドキュメントを参照してください。

このヘルプが必要です。お楽しみください:)

+1

"このようなエラーを取り除く"あなたはエラーを取り除くつもりはない、あなたはちょうど実行時エラーにコンパイル時エラーを変更しています。コンパイラは、あなたが安全であると証明できないことをやっていることをあなたに伝えています。効果的に「ハッシュ、あなた、私がやっていることを知っている」と効果的に言っているのは、ただトラブルを求めているだけです。ここで特に気にするのは、このコードでは失敗が発生しないことですが、後でマップから何かを取り出そうとすると、その値がどこから来たのかを判断するのは非常に難しいことです。 –

+0

同意します。それを訂正してくれてありがとう@Andy。それは "コンパイル時にこのようなエラーを取り除く"のようにすべきです。 –

+1

しかし、あなたはまだ私の欠点を抱えています。コンパイル時のエラーは実行時のエラーよりもはるかに優れているため、後者を盲目的に変更しないでください。 –

関連する問題