Java枚举泛型

Java枚举泛型,java,generics,enums,Java,Generics,Enums,我有一门课,如下所示 public class Baseclass { private final EmployeeEnum empEnum; public Baseclass(EmployeeEnum e) { this.empEnum = e; } } public class Baseclass { private final Enum<?> empEnum; public Baseclass(Enum<?> e) {

我有一门课,如下所示

public class Baseclass {
   private final EmployeeEnum empEnum;
   public Baseclass(EmployeeEnum e) {
       this.empEnum = e;
    }
}
public class Baseclass {
   private final Enum<?> empEnum;
   public Baseclass(Enum<?> e) {
       this.empEnum = e;
    }
}
现在我想让基类成为泛型的,并让它接受某种类型的枚举

由于枚举无法扩展类,我创建了一个接口
IEnum
,并使
EmployeeEnum
ManagerEnum
(我创建的新枚举)实现该接口

我对基类做了如下更改

public class Baseclass {
   private final EmployeeEnum empEnum;
   public Baseclass(EmployeeEnum e) {
       this.empEnum = e;
    }
}
public class Baseclass {
   private final Enum<?> empEnum;
   public Baseclass(Enum<?> e) {
       this.empEnum = e;
    }
}
公共类基类{
私有最终枚举empEnum;
公共基类(枚举e){
this.empEnum=e;
}
}
有更好的方法吗


干杯

如果您只需要任何枚举,那么您可以使用
E扩展枚举

如果需要进一步的限制,例如使子类仅使用特殊类型的枚举(例如实现接口),则可以将接口添加到泛型中,如下所示:

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);
    }

}
公共接口专用{
}
枚举MyEnum实现SpecialEnum{
一、 我,我的,我的;
}
无特殊种{
我,我,特别;
}
公共类基类{
私人期末考试;
公共基类(E){
这个。e=e;
}
}
类扩展了基类{
公共A(MyEnum e){
超级(e);
}
}
//这是不允许的。
类B扩展了基类{
公共A(非特殊e){
超级(e);
}
}
您甚至可以将enum放在扩展类中:

class A extends BaseClass<A.AnotherEnum> {

    enum AnotherEnum implements SpecialEnum {

        Hello, All;
    }

    public A(AnotherEnum e) {
        super(e);
    }

}
A类扩展了基类{
枚举AnotherEnum实现SpecialEnum{
大家好,;
}
公共A(AnotherEnum e){
超级(e);
}
}

如果您只需要任何枚举,则可以使用
E扩展枚举

如果需要进一步的限制,例如使子类仅使用特殊类型的枚举(例如实现接口),则可以将接口添加到泛型中,如下所示:

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);
    }

}
公共接口专用{
}
枚举MyEnum实现SpecialEnum{
一、 我,我的,我的;
}
无特殊种{
我,我,特别;
}
公共类基类{
私人期末考试;
公共基类(E){
这个。e=e;
}
}
类扩展了基类{
公共A(MyEnum e){
超级(e);
}
}
//这是不允许的。
类B扩展了基类{
公共A(非特殊e){
超级(e);
}
}
您甚至可以将enum放在扩展类中:

class A extends BaseClass<A.AnotherEnum> {

    enum AnotherEnum implements SpecialEnum {

        Hello, All;
    }

    public A(AnotherEnum e) {
        super(e);
    }

}
A类扩展了基类{
枚举AnotherEnum实现SpecialEnum{
大家好,;
}
公共A(AnotherEnum e){
超级(e);
}
}
有更好的方法吗

更好的方法是什么?您可以更改为下面的代码,该代码将限制您使用扩展IEnum的枚举:

class Baseclass<T extends Enum<T> & IEnum> {
    private final T empEnum;
    public Baseclass(T e) {
        empEnum = e;
    }
}
类基类{
私人终审法院;
公共基类(TE){
empEnum=e;
}
}
所以
T扩展了Enum
-T必须是一个Enum
&
-和
IEnum
-
T
必须扩展
IEnum

有更好的方法吗

更好的方法是什么?您可以更改为下面的代码,该代码将限制您使用扩展IEnum的枚举:

class Baseclass<T extends Enum<T> & IEnum> {
    private final T empEnum;
    public Baseclass(T e) {
        empEnum = e;
    }
}
类基类{
私人终审法院;
公共基类(TE){
empEnum=e;
}
}
所以
T扩展了Enum
-T必须是一个Enum
&
-和
IEnum
-
T
必须扩展
IEnum

我想要一个类型的枚举。就像一个接口IEnum。我想要一个类型的枚举。就像一个接口IEnum。除了修改类定义之外,还有其他的吗?仅仅通过更改构造函数签名?对不起,这对我来说毫无意义。为什么不想更改类定义?该类具有其他构造函数,这些构造函数接受枚举以外的参数。您的回答很有帮助。谢谢除了修改类定义之外,还有别的吗?仅仅通过更改构造函数签名?对不起,这对我来说毫无意义。为什么不想更改类定义?该类具有其他构造函数,这些构造函数接受枚举以外的参数。您的回答很有帮助。谢谢