簡體   English   中英

如何將泛型參數作為實現接口的枚舉?

[英]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();
  }
}

然后我就可以將MyWidgetMyWidget看起來像這樣的東西:

public class MyWidget<T extends Enum<T> extends MyInterface> {
  ...
}

然后將能夠調用getValue()從方法MyInterfaceT型對象內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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM