2017-04-09 131 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(); 

更清晰,更易于阅读(写)。