2017-02-23 226 views
0

我知道它不可能使用泛型與枚舉,但即時通訊尋找一種方法來實現枚舉與不同返回類型Java:有沒有辦法在枚舉中獲得不同返回類型的方法?

例如,我有以下枚舉:

enum TestEnum { 

    TEST_INTEGER() { 
     @Override 
     public Integer getValue() { 
      return 123; 
     } 
    }, 

    TEST_STRING() { 
     @Override 
     public String getValue() { 
      return "Test"; 
     } 
    }; 

    public abstract Object getValue(); 
} 

在這種情況下TEST_INTEGERTEST_STRINGTestEnum實現。 這就是爲什麼當調用getValue()時,方法getValue()具有返回類型Object而不是IntegerString。這意味着在每種情況下,我都必須投入相關的Classtype。

有沒有更好的方法來直接獲得不同的Classtypes?

回答

2

是的,java允許「減少」返回類型(請參閱here)。

但在您的情況下,這在概念上沒有意義!

TestEnum someEnum = ... 
Integer val = someEnum.getValue(); 

是怎麼想的時,編譯器應該知道你真正分配給該值的枚舉常量其中一個?

因此編譯器只能理解:

Integer val = TestEnum.TEST_INTEGER.getValue(); 

但好,如果你只知道它是TestEnum的一些比如,你正在處理?

0

如果使用<T> T,而不是對象,Java將做一個未經檢查的轉換,這取決於@Override的實現返回類型:

public abstract <T> T getValue(); 

... 

String s = TestEnum.TEST_STRING.getValue(); 
Integer i = TestEnum.TEST_INTEGER.getValue(); 

使用錯誤的「分配」,將導致在運行時一個ClassCastException。因此,如果真正的類型不明顯,它有時會變得很難調試。

+0

這種方法的致命缺陷在於,它要求客戶知道對於每個不同常數所期望的不同返回類型,違反德米特法則等。如果枚舉常量傳遞給變量中的邏輯,客戶端將不知道返回類型是什麼,是嗎?這是一個有缺陷的解決方案,也許是因爲OP有一個有缺陷的問題。他們需要更好的類型分析。 Java不支持非協變返回類型。 –

+0

@LewBloch我知道這不是最佳的,尤其是當多人使用代碼時。 (我絕不會在其他人使用的API中使用這樣的東西)如果你有一個更小的項目,你想要快速和骯髒的存儲不同的類型(例如主機/端口等),這是「好的」。它會是最好在靜態類內部有靜態類型(工作和自動完成一樣),但是枚舉可以通過編程方式迭代,對於需要使用反射的靜態類型。 – dognose

相關問題