2016-08-15 18 views
2

これを知っておくべきですが、何らかの理由でこれを理解できません。キャストリスト<Object>リスト<Map <String、Object >>

なぜオブジェクトのリストList<Object>をマップリストList<Map<String, Object>>にキャストできないのですか?リスト内のすべてのオブジェクトはタイプMap<String, Object>のオブジェクトなので、なぜキャストできないのですか?

私ができることは、new ArrayList<Map<String, Object>>();を作成し、リストを反復して各アイテムをキャストで追加することです。

List<Object> dataList; 
.. 
//Why doesn't this work? 
List<Map<String, Object>> rxData = (List<Map<String, Object>>)dataList; 

//This works, but is there a better way? 
rxData = new ArrayList<Map<String, Object>>(); 
for (Object data : dataList) { 
    rxData.add((Map<String, Object>)data); 
} 
+0

なぜですか?なぜなら、Javaのジェネリックは再解析可能ではないからです。実際にJVMがキャストをチェックする方法はありません。とにかくやりたいだけなら、@SuppressWarnings( "unchecked")は解決策だと思うが、私はそれをテストしなかった。 – markspace

+1

Java generics FAQ:http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20the%20SuppressWarnings%20annotation? – markspace

答えて

3

あなただけのダブルキャストで一般的なパラメータをドロップすることができます。ここで起こっている

@SuppressWarnings("‌​unchecked") 
List<Map<String, Object>> rxData = 
    (List<Map<String, Object>>) (List<?>) dataList; 

は、あなたが最初のキャストでそれを省略してジェネリック型をチェックし、未チェックをしないようにコンパイラに強制ということですList<Map<String, Object>>にキャストします。これはjavaジェネリックがrefiableでないために可能です。

元のエラーがObjectMap<>タイプと互換性がないと(例えばscala異なり)ジャワにおける共変/反変タイプのようなものが存在しないことに起因します。

しかし、dataListにマップが含まれていないと問題が発生します。

+2

ここでは生のタイプは必要ありません。問題は再互換性に関係しません。 –

+0

@ k5_が同意します。ありがとう!しかし、とにかくそれはチェックされていないキャストされます。私は私の答えを編集します – vsminkov

+0

ありがとう! OK、私は理解していると思います。リストにはマップ以外のものは含まれないように注意する必要があります。 – Andy

4

List<Object>およびList<Map<String, Object>>are not compatible typesです。したがって、直接一方を他方にキャストすることはできません。それはunsafe castですので、あなたはまだ、コンパイル時に警告を受けるだろうと

List<Map<String, Object>> rxData = (List<Map<String, Object>>)(List<?>)dataList; 

注:あなたは、共通のスーパータイプへの最初のキャストにして、意気消沈しています。リンク

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

二つの一般的なクラスのType1とType2の次

0

チェックは一切関係ありません。だから、あなたは型キャストできません。

ただし、安全でない操作をしてループから自分自身を救うことができます。

//unsafe assignments 
List rxData = (List<Map<String, Object>>)dataList; 

List<Object> dataList = (List<Object>)rxData; 
関連する問題