Java枚举泛型

时间:2015-12-02 13:31:52

标签: java generics enums

我有一个课程如下,

public class Baseclass {
   private final EmployeeEnum empEnum;
   public Baseclass(EmployeeEnum e) {
       this.empEnum = e;
    }
}

现在我想让Baseclass变得通用,并让它接受某种类型的枚举。

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

我已经对Baseclass进行了如下更改,

public class Baseclass {
   private final Enum<?> empEnum;
   public Baseclass(Enum<?> e) {
       this.empEnum = e;
    }
}

有更好的方法吗?

干杯!!

2 个答案:

答案 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>,以便他们可以继承namevalues等标准方法。这是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