これが以前に尋ねられた場合はすみません(ほぼ間違いありません)が、適切なキーワードが見つからないか、無関係なジェネリックの質問の山からそれを掘り下げることができません。
これは機能します:
Object a = null;
Set<Object> b = (Set<Object>)a;
では、なぜこれがコンパイラエラーになるのでしょうか。
Set<Object> c = null;
Set<Set<Object>> d = (Set<Set<Object>>)c;
そして、なぜこの簡単な回避策が有効なのですか?
Set<Object> e = null;
Set<?> f = (Set<?>)e;
Set<Set<Object>> g = (Set<Set<Object>>)f;
Map<Number, Object>
前処理されたJSONメッセージのを返すライブラリメソッドがあります。手動によるディープタイプチェックの後、それをキャストしてとして返す必要がありMap<Number, Map<String, Map<String, Object>>>
ます。チェックしたばかりなので無視できる、チェックされていないキャスト警告を期待しています。
ただし、コンパイラエラーが発生します。
Error:(61, 10) java: Cannot cast from java.util.Map<java.lang.Number,java.lang.Object> to java.util.Map<java.lang.Number,java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>>>
またはより読みやすい形式(IDEのエラーに基づく):
Inconvertible types; cannot cast 'Map<Number,Object>' to 'Map<Number,Map<String,Map<String,Object>>>'
)
[編集] 方法に関する質問から、理由に関する質問に変更されました。
ジェネリック型は実行時に消去されるため、これらのキャストを行っても実際には何も起こりません。「コンパイラはこれを許可しますか?」
ジェネリックの目的の1つは、型の安全性を確保することです。何らかの理由でに割り当てList<List<Object>>
られるとList<Object>
、タイプセーフが失われます。
List<List<Object>> listOfLists = new ArrayList<>();
List<Object> list = listOfLists; // suppose this is valid
list.add(new Object());
listOfLists.get(0); // what happens here?
(ここでは便宜上リストを使用しています。これはマップやセット、またはその他の一般的なタイプに簡単に適用できます)
listOfLists.get(0)
Object
追加したので、のインスタンスを返しますが、そうではありません!タイプList<List<Object>>
だから!これが、このようにキャストできることが型の安全性を損なう理由です。
ただし、以下の2つのキャストは有効です。
List<Object> e = null;
List<?> f = (List<?>)e;
List<List<Object>> g = (List<List<Object>>)f;
List<?> f
「f
は、拡張するクラスのリストですObject
が、そのクラスは何でもかまいません」を意味します。とList<?>
は異なることに注意してくださいList<Object>
。必ずしもf.add("String")
と?
は限らないので、できませんString
。
最初のキャストは、ほとんどの人が(誤って)List<String>
に割り当てられると信じるのと同じ理由で許可されList<Object>
ます。実際、このキャストは必要ありません。A List<String>
は List
拡張されるものですObject
。
2番目のキャストは?
、何であるかを知っていることをコンパイラに伝えることですList<Object>
。コンパイラ?
は、チェックされていない警告を発行することにより、何が間違っているかを警告します。
ある意味で、なぜInteger
to から直接キャストできないString
が、最初にInteger
toからObject
thenにキャストできるのかを尋ねるようなものですString
。
あなたの混乱は、間の違いの誤解が原因である可能性がありような気が<Object>
して<?>
。この投稿は一読の価値があるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加