2017-04-09 111 views
-1

我想創建一個Map<Long, Enum< ? extends SomeInterface>。對我來說哪個是最好的選擇?混亂的數據結構

我想這一個

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映射到相應的可能答案值。可能的答案是枚舉

可能的答案被包裹這樣的:

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

因此對於每個QuestionId,都有相同的AnswerEnum集合,它們有什麼不同? – Beri

+0

他們是不同的。每個AnswerEnum擴展SomeEnum – user3681970

+0

但它不總結。在你的例子中,你有一組答案,根據描述,你需要將Single QuestioId映射到單個答案 – Beri

回答

1

有一個小問題,命名,我認爲:

你不能與其他在Java擴展一個枚舉,使用的界面與期望方法來代替,如下面

而下面的代碼工作正常:

@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

謝謝!關鍵是所有的QuestionEnums被包裝在一個類中,我已經更新了這個問題。給出了上述相同的錯誤 – 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()返回一個int而不是long,這些東西令編譯器感到困惑,因此無法給出明確的錯誤消息。

我會注意到,流API真的不是一個乾淨的方式來構建一個常量映射。即使需要static {}模塊或輔助功能,只需構建一個「通常」Map.put()地圖就可能更簡單易讀。你甚至可以更好地Guavaimmutable 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(); 

更清晰,更易於閱讀(寫)。