2017-04-09 8 views
-1

Map<Long, Enum< ? extends SomeInterface>を作成したいと思います。どちらが私にとって最良の選択ですか?chossingデータ構造の混乱

私はこの1つ

private Map<Long, Enum<? extends SomeInterface>[]> questionIdToanswersMapping = Collections.unmodifiableMap(Stream.of(
     new SimpleEntry<>(QuestionEnum1.getQuestionId(), AnswerEnum1.values()), 
     new SimpleEntry<>(QuestionEnum2.getQuestionId(), AnswerEnum2.values()), 
     new SimpleEntry<>(QuestionEnum3.getQuestionId(), AnswerEnum3.values()), 
     new SimpleEntry<>(QuestionEnum4.getQuestionId(), AnswerEnum4.values()), 
     new SimpleEntry<>(QuestionEnum5.getQuestionId(), AnswerEnum5.values())) 
.collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()))); 

を試してみました。しかし、エラーが「Map<Object,Object>からMap<Long,Enum<? extends SomeEnum>[]>に変換することはできません」与えています。私はこれに新しいです。助けてください!

腐食可能な回答値に質問IDの変更不可能なマップが必要です。可能な答えを列挙

可能な回答は次のようにラップされている:あなたが希望を持つJava、使用インタフェースで相互に1つの列挙型を拡張することはできません

を:

public class RecognizedAnswers { 
public enum AnswerEnum1 implements SomeInterface; 
public enum Answer2 implements SomeInterface; 
} 
+0

したがって、QuestionIdごとに同じanswerEnumセットがありますが、それらの違いは同じですか? – Beri

+0

彼らは異なっています。各AnswerEnumはSomeEnumを拡張します – user3681970

+0

しかし、それは要約しません。あなたの例では、答えの集まりがあり、その説明に従って、単一のQuestioIdを単一回答にマップする必要があります。 – Beri

答えて

1

私は思うの命名の小さな問題がありますこの方法ではなく、

以下のように、コードの下には、正常に動作している:

@Test 
    public void test() { 
     Map<Long, Enum<? extends SomeEnum>[]> questionIdToanswersMapping = Collections.unmodifiableMap(Stream.of(
       new AbstractMap.SimpleEntry<>(QuestionEnum1.A.getQuestionId(), AnswerEnum1.values()), 
       new AbstractMap.SimpleEntry<>(QuestionEnum1.B.getQuestionId(), AnswerEnum1.values()), 
       new AbstractMap.SimpleEntry<>(QuestionEnum1.C.getQuestionId(), AnswerEnum2.values()), 
       new AbstractMap.SimpleEntry<>(QuestionEnum1.D.getQuestionId(), AnswerEnum2.values()) 
       ) 
       .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()))); 

     System.out.print(questionIdToanswersMapping.size()); 
    } 

    enum QuestionEnum1 { 
     A, B, C, D; 

     Long getQuestionId() { 
      return (long) name().hashCode(); // my mocked values 
     } 

    } 

    interface SomeEnum { 

    } 

    enum AnswerEnum1 implements SomeEnum { 

    } 
    enum AnswerEnum2 implements SomeEnum { 

    } 
+0

ありがとうございます。すべてのQuestionEnumがクラスにラップされています。問題と同じエラーが返されます – user3681970

0

私はあなたの例を再現してみました(あなたが列挙型を難読化するので、私は自分を作った)、それはうまくコンパイルに表示されます。

enum SomeEnum { FOO, BAR } 

private Map<Long, Enum<? extends SomeEnum>[]> exampleMap = 
    Collections.unmodifiableMap(Stream.of(
     new SimpleEntry<>(1L, SomeEnum.values())) 
     .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue))); 

私の推測では、あなたが不足している括弧のいずれかを持っているということである、またはあなたのQuestionEnum1.getQuestionId()longではなくintを返します。これらのことは、明らかなエラーメッセージを表示できないほどコンパイラを混乱させます。

ストリームAPIは、実際には定数マップを構築するためのきれいな方法ではありません。 Map.put()で「通常」のようなマップを作成するだけで、ブロックまたはヘルパー機能が必要な場合でも、読みやすくなります。あなたはそのように使用することができGuavaさんimmutable collections、とさらに良く行うことができます:読み取り(および書き込み)する

private final ImmutableMap<Long, Enum<? extends SomeEnum>[]> questionIdToanswersMapping = 
    ImmutableMap.builder() 
     .put(QuestionEnum1.getQuestionId(), AnswerEnum1.values()) 
     .put(QuestionEnum2.getQuestionId(), AnswerEnum2.values()) 
     .put(QuestionEnum3.getQuestionId(), AnswerEnum3.values()) 
     .put(QuestionEnum4.getQuestionId(), AnswerEnum4.values()) 
     .put(QuestionEnum5.getQuestionId(), AnswerEnum5.values()) 
     .build(); 

より鮮明かつ容易。