2012-08-10 88 views
7

我试图具有延伸的通用接口枚举的集合,所以像:Enum <?扩展接口>

interface Fooable 
{ 
    void someCommonMethod(); 
} 

enum E1 implements Fooable 
{ 
    // some enumuerations and a definition for someCommonMethod() 
} 

enum E2 implements Fooable 
{ 
    // some different enumerations and a different definition for someCommonMethod() 
} 

,然后利用这个别处通过强制执行这两个,一个变量是一个枚举实现接口。因此沿线的东西..

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 

然而,到目前为止,我似乎有投FE为了把它当作实现接口,即

bar(Enum<? extends Fooable> fe) 
{ 
    fe.ordinal(); 
    ((Fooable)fe).someCommonMethod(); 
} 

,虽然这应该是安全......这似乎并不理想,我可能会忽视某些事情。当然,如果我尝试将参数作为Fooable传递,那么我会抛出它将其视为Enum,不仅如此,我现在还不安全。如下图:

bar(Fooable fe) 
{ 
    // potentially unsafe cast! 
    ((Enum<?>)fe).ordinal(); 
    fe.someCommonMethod(); 
} 

有什么我俯瞰或者是

Enum<? extends Fooable> 

约接近一个“好”的解决方案,我会得到什么?

我对Java相对比较陌生,并且还在追赶自己,试图像C或C++一样使用它,所以如果我把它当作一把锤子而不是锯子或者忽略某种东西,可以随意指出它:)

回答

1

一种选择你哈ve是将您需要的Enum中的任何方法添加到Fooable中,或者创建一个扩展Fooable并添加所需的Enum方法的新接口。

例子:

interface Fooable { 
    void someCommonMethod(); 
} 

interface FooableEnum extends Fooable { 
    int ordinal(); 
} 

enum E1 implements FooableEnum { 
    // Implement someCommonMethod. 
    // ordinal() is already implemented by default. 
} 

一旦你做到了这一点,你可以在你的方法签名使用FooableEnum作为参数类型,而不用担心任何的通用的东西。

+0

我想过这件事,但我对它的行为有所保留,值(),可能值得重新审视,因为现在我无法疏通有效的保留... – Khanmots 2012-08-10 22:29:03

+0

这需要一个不必要的接口。 – 2012-08-10 22:55:58

+0

@Mike,我越想越想越是正确的道路。我的要求并不是真的,类型**是一个枚举,而是它具有枚举的**行为**。我也相信自己价值()的东西不会是一个问题,并且我是愚蠢的。 – Khanmots 2012-08-10 22:59:02

18

这表示T扩展Enum并实现Fooable:

<T extends Enum<T> & Fooable> 

因此,你的方法可以写成:

<T extends Enum<T> & Fooable> void bar(T fe) { 
    fe.ordinal(); 
    fe.someCommonMethod(); 
} 
+0

是的,但我的理解是这只是用于声明一个通用的方法没有定义参数? – Khanmots 2012-08-10 21:58:05

+2

@Khanmots [方法本身可以是通用的](http://docs.oracle.com/javase/tutorial/extra/generics/methods.html)。 – 2012-08-10 21:58:31

+0

没有想到这种方法......曾经试验过使用T的接口扩展Enum &Fooable ,但可能必须仔细研究使封闭类通用,以便它的所有方法都可以有一个T与两个约束... – Khanmots 2012-08-10 22:01:34