簡體   English   中英

在Java中使用Enum的泛型

[英]Generics using Enum in Java

我有一個枚舉

public enum Days {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY 

}

我想創建一個可以獲取類型為days的值的類。 所以我使用了Java Generics

public class State<T extend Days>

但是有一個錯誤

The type parameter T should not be bounded by the final type Days. 
Final types cannot be further extended

我該如何解決這個問題?

枚舉是最終類型,這意味着,您無法從它們擴展

一般類似想要一個Class作為參數,它是Days或擴展類,但擴展類是不可能的

因此唯一可能的參數是Days,如果只有一個值,則不需要泛型

不要使用泛型綁定。 沒有必要。 只需使用無界類型,如下所示:

public class State<T> {
    public State(T startState) {
        // whatever
    } 
}

並使用它:

State<Days> dayState = new State<Days>(Days.SUNDAY);

這是一個簡單的類型類,不需要綁定。

可能有意義的唯一界限是enum

public class State<T extends Enum<T>> {
    public State(T startState) {
        // whatever
    } 
} 

此版本要求泛型參數為enum 使用此版本,上面的用法示例仍然可以編譯,但這不會編譯(例如):

State<String> dayState = new State<String>("hello");

因為String不是enum

你不能在java中擴展枚舉(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html到最后)。 因此是不可能的。

-IF你需要你的班級只用你的enum工作,你不需要泛型

- 相反,你需要它與其他枚舉(它有意義嗎?)你不需要指定擴展。

你的國家班級到底做了什么?

這里要做的是

public enum Days{..}

public class State { // no generic argument!
  ...
}

就目前而言,你不能擁有State<T extends Days>因為滿足T extends Days的唯一方法就是讓T Days 這就是Days final

因此,您應該使State 不是通用的,並在您嘗試使用T任何地方直接使用Days 你不能聲明public class State<Days> ,因為它會嘗試將Days視為一個類型變量,而不是類Days ,這不是你想要的。

這在Java 6下編譯得很好:

public enum Days {
  SUNDAY, 
  MONDAY, 
  TUESDAY, 
  WEDNESDAY,
  THURSDAY, 
  FRIDAY, 
  SATURDAY
}

public class State<T extends Days> {
  T state;

  public State(T startState) {
    this.state = startState;
  }
}

private void test() {
  State<Days> state = new State<Days> (Days.MONDAY);
}

但是,如果您希望State對象從一個enum更改為另一個enum ,那么最好使用以下內容:

public class State<S extends Enum<S>> {
  final ArrayList<S> states = new ArrayList<S>();
  private S state;

  public State(S startState) {
    states.addAll(EnumSet.allOf(startState.getClass()));
    this.state = startState;
  }

  public S next() {
    return state = states.get((state.ordinal() + 1) % states.size());
  }

  public S prev() {
    return state = states.get((state.ordinal() - 1 + states.size()) % states.size());
  }

  public S set(S newState) {
    return state = newState;
  }

  public S get() {
    return state;
  }
}

private void test() {
  State<Days> state = new State<Days> (Days.MONDAY);
  // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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