![](/img/trans.png)
[英]Why ”Type Bound mismatch: The type ? extends T is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type Enum<E>“?
[英]Why not extending from Enum<E extends Enum<E>>
我偶然發現了以下我無法從 class 擴展和實現的問題,它在 Java 1.5(java.lang 包)中定義
public abstract class Enum<E extends Enum<E>> {...
}..
我遇到的問題是創建我自己的具有不同序數值的枚舉類型。 我不想通過使用不同的序號名稱來實現它,比如 getCode() 等。所以我想我可以 go 擴展上面的 class 的方式。
public final class XYZ extends Enum<XYZ> { //Does not work.
//
A("A", 1),
B("B", 7);
.
}
我知道我可以做到以下幾點:
public enum NEWEnum {
A(1),
B(7);
private int code;
private NEWEnum(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
}
我寧願在 Enum 中使用通常的命名方式,例如 ordinal() 和 name() 。
你不能像那樣擴展 Enum 。 它內置於編譯器或運行時(不確定是哪個)。
但是看起來您正在嘗試解決錯誤的問題; 枚舉值的序號不應該具有任何功能意義。 一旦你給它一個,它應該有一個不同於“Ordinal”的名字。 您的第二個代碼片段遠遠優於您的第一個代碼片段。
一般來說,任何事情都依賴序號是不好的做法; 它可能從一開始就不應該被曝光。 您唯一可以依賴的就是名稱,以及您自己分配的任何值。
如果將字段命名為“序號”對您來說很重要,只需使用類型安全的 枚舉模式(第 21 項) ,枚舉只是它的一個實現。
Enum 得到編譯器的特殊處理,像 EnumSet 這樣的類根據這種處理做出假設。 像ordinal()
和name()
這樣的枚舉方法的行為是嚴格定義的,自己實現它們來復制這種行為是沒有意義的。 此外,聲明枚舉值的語法僅在enum
中有效,不會在class
中編譯。
重要的是要記住,您永遠不應該自己使用ordinal()
,因此根據您的問題定義它是沒有意義的。
Enum
class 在 Java 中是特殊的,因為它用於實現 Enum 語言功能。 因此,它不僅是 class,與 Java 中的任何其他 class 一樣,而且更特殊(如String
,其+
運算符已重載,或如盒裝類)。 為了使這些功能起作用,需要對枚舉有特殊要求(比如,我猜,連續的序數)。 因此 Java 語言規范明確禁止手動繼承Enum
class。
枚舉在語言核心和特殊用途中具有特殊含義。 因此,您可以在switch
語句中使用它們,這對於普通類來說是不可能的。
例如,如果您顯式實現它,則不必在構造函數中初始化“name”和“ordinal”屬性。 以后可能會導致NPE。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.