man*_*_nz 1 java generics enums
我有一个课程如下,
public class Baseclass {
private final EmployeeEnum empEnum;
public Baseclass(EmployeeEnum e) {
this.empEnum = e;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想使Baseclass通用并使其接受某种类型的枚举.
由于枚举不能延长我已经创建了一个接口的类IEnum,并提出EmployeeEnum和ManagerEnum(我创建新枚举)实现的接口.
我已经对Baseclass做了如下更改,
public class Baseclass {
private final Enum<?> empEnum;
public Baseclass(Enum<?> e) {
this.empEnum = e;
}
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
干杯!!
如果您只想要任何枚举,那么您可以使用E extends Enum<E>.
public class Baseclass<E extends Enum<E>> {
private final E e;
public Baseclass(E e) {
this.e = e;
}
}
Run Code Online (Sandbox Code Playgroud)
所有enums都扩展,Enum<E>以便它们可以继承标准方法,如name和values.这是enums不能扩展其他类的原因之一,因为classJava中不允许扩展两个类.
每个子类必须BaseClass使用如下特定的枚举进行扩展:
enum MyEnum {
I, Me, My, Mine;
}
class A extends BaseClass<MyEnum> {
public A(MyEnum e) {
super(e);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要进一步的限制 - 例如让子类只使用特殊类型的枚举(例如实现接口),那么你可以像这样添加接口到泛型:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
你甚至可以将枚举放在扩展类中:
class A extends BaseClass<A.AnotherEnum> {
enum AnotherEnum implements SpecialEnum {
Hello, All;
}
public A(AnotherEnum e) {
super(e);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |