Если вам просто нужно любое перечисление, вы можете использовать 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
s не может расширять другие классы, потому что никакому class
в Java не разрешено расширять два класса.
Каждый подкласс должен расширять 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);
}
}
person
OldCurmudgeon
schedule
02.12.2015