[英]Java enum generics
我的課程如下
public class Baseclass {
private final EmployeeEnum empEnum;
public Baseclass(EmployeeEnum e) {
this.empEnum = e;
}
}
現在,我想使Baseclass通用並使其接受某種類型的Enums。
由於枚舉不能擴展類我已經創建了一個接口IEnum
並提出EmployeeEnum
和ManagerEnum
(新枚舉我創建)實現的接口。
我對Baseclass做了如下更改,
public class Baseclass {
private final Enum<?> empEnum;
public Baseclass(Enum<?> e) {
this.empEnum = e;
}
}
有一個更好的方法嗎?
干杯!!
如果只需要任何枚舉,則可以使用E extends Enum<E>
。
public class Baseclass<E extends Enum<E>> {
private final E e;
public Baseclass(E e) {
this.e = e;
}
}
所有enum
擴展Enum<E>
以便它們可以繼承標准方法,例如name
和values
。 這是enum
不能擴展其他類的原因之一,因為Java中不允許任何class
擴展兩個類。
每個子類都必須使用特定的枚舉對BaseClass
進行擴展,如下所示:
enum MyEnum {
I, Me, My, Mine;
}
class A extends BaseClass<MyEnum> {
public A(MyEnum e) {
super(e);
}
}
如果您想要進一步的限制-例如使子類僅使用特殊類型的枚舉(例如實現接口),則可以將接口添加到泛型中,如下所示:
public interface SpecialEnum {
}
enum MyEnum implements SpecialEnum {
I, Me, My, Mine;
}
enum NotSpecialEnum {
Am, I, Special;
}
public class BaseClass<E extends Enum<E> & SpecialEnum> {
private final E e;
public BaseClass(E e) {
this.e = e;
}
}
class A extends BaseClass<MyEnum> {
public A(MyEnum e) {
super(e);
}
}
// This is not allowed.
class B extends BaseClass<NotSpecialEnum> {
public A(NotSpecialEnum e) {
super(e);
}
}
您甚至可以將枚舉放入擴展類中:
class A extends BaseClass<A.AnotherEnum> {
enum AnotherEnum implements SpecialEnum {
Hello, All;
}
public A(AnotherEnum e) {
super(e);
}
}
有一個更好的方法嗎?
更好的方法是做什么? 您可以更改為以下代碼,該代碼將限制您使用擴展IEnum的枚舉:
class Baseclass<T extends Enum<T> & IEnum> {
private final T empEnum;
public Baseclass(T e) {
empEnum = e;
}
}
因此, T extends Enum<T>
-T必須是Enum &
-,而IEnum
- T
必須擴展IEnum
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.