2017-06-07 9 views
1

私はあなたがkeyStringであることを見ることができるようにキーセットとキー異なるデータ型

enter image description here

以下のようにLinkedHashSetの私のkeysetkeyは、異なるデータ型を含むされているユニークな状況を見ていますkeysetlongです。

次のコードは、そのため失敗している:

modifiedRowKeys.toArray(new Long[modifiedRowKeys.size()]); 

は私がArrayStoreExceptionStringの値を取得します。

私はMap<Long, Map<String,Object>>を私のSpringサーバーに送信しているAngularアプリケーションからこれを複製することができました。このサーバーには、共有されているデータが入っています。

enter image description here

編集1

日食で、次の奇妙な行動を参照してください。

enter image description here

それは我々がの変換のために使用されているジャクソンマッパーとの問題である可能性がありオブジェクト?

編集2

次のコードは、

文字列は、これはかなりまっすぐ進むロジックを思わ

Set<Long> modifiedRowKeys = modifiedRowMap.keySet(); 
Long[] periodDateArray = new Long[modifiedRowKeys.size()]; 

int count = 0; 
Iterator<Long> keyIterator = modifiedRowKeys.iterator(); 
while(keyIterator.hasNext()){ 
    Long key = keyIterator.next(); 
    System.out.println("key instanceof Long : " + (key instanceof Long)); 
    periodDateArray[count++] = Long.valueOf(key); 
} 

ロング

にキャストすることはできないと言って ClassCastExceptionで失敗しました!

編集3:

次のように私は、問題を再現しています

public static void main(String[] args) { 

     CollectionsToArray collectionsToArray = new CollectionsToArray(); 

     Map<String, Map<String, Object>> mapOfNumbers = collectionsToArray.prepareStrangeNumbersSetFromMapOfMap(); 

     Object obj = mapOfNumbers; 
     collectionsToArray.convertMapToKeySetToArray(obj); 

    } 

    private Map<String, Map<String, Object>> prepareStrangeNumbersSetFromMapOfMap() { 
     Map<String, Map<String, Object>> longNumberMap = new LinkedHashMap<>(); 

     Map<String, Object> stringValueMap = new HashMap<>(); 
     stringValueMap.put("Adams", "Adithya"); 
     stringValueMap.put("Edge", 80); 

     longNumberMap.put("1488376800000", stringValueMap); 

     return longNumberMap; 
    } 

    private void convertMapToKeySetToArray(Object obj) { 
     Map<Long, Map<String, Object>> mapOfNumbers = (Map<Long, Map<String, Object>>) obj; 
     Set<Long> stringNumbers = mapOfNumbers.keySet(); 

     convertLongKeySetToArray(stringNumbers); 
    } 

    private void convertLongKeySetToArray(Set<Long> stringNumbers) { 
     Long[] stringNumbersArray = stringNumbers.toArray(new Long[0]); 
     Arrays.sort(stringNumbersArray); 

     System.out.println(stringNumbersArray); 
    } 
+1

長いことをキーとしてキー、値リストをWebページに送信した後、文字列をキーとしてリストを返します。 – freedev

+2

[mcve]を提供できますか?あなたの説明は不明で、あなたのコードをすべて表示していません...コードを画像ではなくテキストとして貼り付けてください。 – assylias

+2

そして、 '(key instanceof Long)'の周囲にbrakcetsを置く必要があります。そうでなければコンパイルされません。 – assylias

答えて

2

私はあなたのコードを実行した場合:

そしてStringないに知られているので、これは失敗したが、何も実行時のチェックは(も不足している括弧を追加する)必要はありません、コンパイル時にLongことMap<Long, String>で「編集2」をコンパイルして正常に動作します。だから問題はあなたが今までに示したものではありません。上記のように、問題を再現する[mcve]を作成してみてください。

Map m = new HashMap(); //raw map received from jackson 
m.put("abc", "def"); //it's in fact a Map<String, String> 
Map<Long, String> modifiedRowMap = m; //but you cast it to something else 

残りのコードがコンパイルされますが、あなたは、実行時に例外が発生します:

私の最高の推測では、あなたがこのような何かを持っているということです。

+0

編集3を参照してください。 – Adithya

+0

@Adithyaそうです、あなたは 'Object'としてメソッドに渡した' Map 'を持っていて、それを' Map 'にキャストします。コンパイラはチェックされていないキャストに関する警告を表示します。なぜあなたのコードが動作すると思いますか? – assylias

+0

実際、jacksonマッパーを使ってSpringサーバーのMap >にjavascriptオブジェクトをキャプチャしました。私はそれをするつもりはなかった:)。再作成するには、Edit 3を追加しました。 – Adithya

1

あなたはkeyがStringであることを何かを、混乱しているが、keySetが実際に表示するためにtoStringを使用していますSetです[]の出力。

Set<String> set = new HashSet<>(); 
set.add("1"); 
set.add("2"); 
System.out.println(set); // [1, 2] 

だから、StringSet(長くはない)を持っています。

System.out.println("key instanceof Long" + (s instanceof Long)); 
+0

もしそれがに設定されていれば分かります。質問はなぜそれがセットですか? コードはなぜ keys = modifiedRowMap.keySet();コンパイル?それはセットのためにコンパイルする必要がありますか? – Adithya

関連する問題