[英]How can I require a generic parameter to be an enum that implements an interface?
我不是100%確信這是一個好主意,但我今天碰到了一些目前實現的代碼:
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
然后, MyWidget
提供了使用mValueMap
將傳入的Enum
轉換為Integer
或從Integer
轉換的方法。
我正在考慮做的是試圖重構這個,以便我宣布我的枚舉:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
然后我就可以將MyWidget
重MyWidget
看起來像這樣的東西:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
然后將能夠調用getValue()
從方法MyInterface
上T
型對象內MyWidget
。 當然,問題是“ <T extends Enum<T> extends MyInterface>
”是無效的語法。 有什么辦法可以解決這個問題嗎?
我不想讓MyWidget<T extends MyInterface>
,因為T是枚舉也很重要。
提前致謝!
使用' &
'代替:
public class MyWidget<T extends Enum<T> & MyInterface> {
...
}
JLS將其稱為“交集類型”,但我在Java教程中找不到它。 我只是說它完全符合你所希望的“ extends
”所做的。
另外,我應該提一下,你可以在交集類型中擁有任意數量的類型。 所以,如果你想,你可以這樣做:
public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
...
}
[注意:此代碼示例不應被視為對Cloneable
接口的認可; 它在當時只是方便。]
JDK 7的JSR 203(新的新IO)正在大量使用實現接口的枚舉(例如: http : //openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption .html )允許他們將來有一些擺動空間用於未來的額外枚舉選項。 所以這是一種可行的方法,顯然是在一個大型Sun項目中經過深思熟慮后選擇的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.