2015-12-02 92 views
1

我有如下的一类,Java的泛型枚举

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

现在,我想使基类的通用,并使其接受某种类型的枚举。

由于枚举不能扩展类我已经创建了一个接口IEnum和制成EmployeeEnumManagerEnum(新枚举我创建)实现的接口。

我已经修改了基类下面,

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

有没有更好的方式来做到这一点?

干杯!

回答

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 s无法扩展其他类的原因之一,因为允许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); 
    } 

} 
+0

我想要一个类型的枚举。就像一个界面IEnum。 –

+0

@mani_nz - 我已经添加了一些进一步改进的例子。 – OldCurmudgeon

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

+0

无论如何,除了修改类定义?只需更改构造函数签名? –

+0

对不起,但这对我没有意义。为什么你不想改变类定义? –

+0

该类有其他构造函数,它们使用Enums以外的参数。 –