ความสับสนในการเลือกโครงสร้างข้อมูล

ฉันต้องการสร้าง 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>[]>" ฉันยังใหม่กับสิ่งนี้ กรุณาช่วย!

ฉันต้องการแผนที่รหัสคำถามที่ไม่สามารถแก้ไขได้กับค่าคำตอบที่เป็นไปได้ที่สอดคล้องกัน คำตอบที่เป็นไปได้คือ Enums

คำตอบที่เป็นไปได้จะมีลักษณะดังนี้:

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

person user3681970    schedule 09.04.2017    source แหล่งที่มา
comment
ดังนั้นสำหรับแต่ละ QuestionId จะมีชุด AnswerEnum เหมือนกัน แต่ต่างกันอย่างไร   -  person Beri    schedule 09.04.2017
comment
พวกเขาแตกต่าง. AnswerEnum แต่ละอันจะขยาย SomeEnum   -  person user3681970    schedule 09.04.2017
comment
แต่สรุปไม่ได้.. ในตัวอย่างของคุณ คุณมีชุดคำตอบ และตามคำอธิบาย คุณต้องแมป QuestioId เดียวกับคำตอบเดียว   -  person Beri    schedule 09.04.2017
comment
ฉันอัปเดตคำถามแล้ว เนื่องจากฉันเปลี่ยนชื่อตัวแปรก่อนที่จะโพสต์คำถาม ฉันจึงพลาดจุดนั้นไป AnswerEnum แต่ละอันจะขยาย SomeEnum   -  person user3681970    schedule 09.04.2017
comment
ฉันคิดว่าใน Java ไม่สามารถขยาย enum ได้   -  person Alexander Kulyakhtin    schedule 09.04.2017
comment
ถูกต้อง @AlexanderKulyakhtin   -  person Sharon Ben Asher    schedule 09.04.2017
comment
@AlexanderKulyakhtin ใช่ .. มันเป็นอินเทอร์เฟซ ฉันได้อัปเดตคำถามแล้ว คำตอบด้านล่างยังคงให้ข้อผิดพลาดเดียวกันกับที่กล่าวถึงในคำถาม กรุณาช่วย!   -  person user3681970    schedule 09.04.2017
comment
โปรดทราบว่าจริงๆ แล้ว คือ เป็นไปได้ที่จะขยายแจงนับ (แม้ว่าจะอยู่ภายในคำจำกัดความแจงนับเท่านั้น) การใช้เมธอดเฉพาะค่าคงที่ (ที่กล่าวถึงใน Java ที่มีประสิทธิภาพ: รายการที่ 30) ทำให้ค่าคงที่ enum ขยาย ประเภท enum ซึ่งหมายความว่าบางครั้ง MyEnum.getClass().equals(MyEnum.VALUE.getClass() สามารถคืนค่า false ได้ นี่คือตัวอย่างจากคำถาม SO   -  person dimo414    schedule 11.04.2017


คำตอบ (2)


ฉันคิดว่ามีปัญหาเล็กน้อยเกี่ยวกับการตั้งชื่อ:

คุณไม่สามารถขยาย enum หนึ่งกับอีก enum ใน 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 {

    }
person Beri    schedule 09.04.2017
comment
ขอบคุณ! ประเด็นก็คือ All QuestionEnums ถูกรวมอยู่ในชั้นเรียน ฉันได้อัปเดตคำถามแล้ว รหัสข้างต้นให้ข้อผิดพลาดเดียวกันกับที่กล่าวถึงในคำถาม - person user3681970; 09.04.2017

ฉันพยายามจำลองตัวอย่างของคุณ (เนื่องจากคุณทำให้ประเภท enum สับสน ฉันจึงสร้างตัวอย่างขึ้นมาเอง) และดูเหมือนว่าจะคอมไพล์ได้ดี:

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 และสิ่งเหล่านี้ทำให้คอมไพเลอร์สับสนมากจนไม่สามารถแสดงข้อความแสดงข้อผิดพลาดที่ชัดเจนได้

ฉันจะทราบว่า Stream API ไม่ใช่วิธีที่สะอาดในการสร้างแผนที่คงที่จริงๆ การสร้างแผนที่แบบ "ปกติ" ด้วย Map.put() น่าจะง่ายกว่าและอ่านง่ายกว่า แม้ว่าจะต้องใช้บล็อก static {} หรือฟังก์ชันตัวช่วยก็ตาม คุณยังทำได้ดียิ่งขึ้นด้วย Guava ของ คอลเลกชันที่ไม่เปลี่ยนรูป ซึ่งสามารถนำมาใช้ดังนี้:

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();

ชัดเจนและอ่านง่ายกว่ามาก (และเขียน)

person dimo414    schedule 09.04.2017