我有一个课程如下,
public class Baseclass {
private final EmployeeEnum empEnum;
public Baseclass(EmployeeEnum e) {
this.empEnum = e;
}
}
现在我想让Baseclass变得通用,并让它接受某种类型的枚举。
由于Enum无法扩展一个类,我创建了一个接口IEnum
并使EmployeeEnum
和ManagerEnum
(我创建的新枚举)实现了接口。
我已经对Baseclass进行了如下更改,
public class Baseclass {
private final Enum<?> empEnum;
public Baseclass(Enum<?> e) {
this.empEnum = e;
}
}
有更好的方法吗?
干杯!!
答案 0 :(得分:8)
如果您只想要任何枚举,那么您可以使用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);
}
}
答案 1 :(得分:2)
有更好的方法吗?
更好的方式做什么?您可以更改为下面的代码,这将限制您扩展IEnum的枚举:
class Baseclass<T extends Enum<T> & IEnum> {
private final T empEnum;
public Baseclass(T e) {
empEnum = e;
}
}
所以T extends Enum<T>
- T必须是枚举
&
- 和
IEnum
- T
必须延长IEnum
。