枚举<! - ?扩展接口 - >

时间:2012-08-10 21:35:32

标签: java interface enums type-constraints

我正在尝试使用扩展常用界面的枚举集合,例如:

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

然后通过强制执行变量是Enum 来实现接口,从而在其他地方使用它。所以有些东西......

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

然而,到目前为止,为了将其视为实现接口,我似乎必须抛出fe,即

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

虽然这应该是安全的...但它似乎不是最理想的,我可能会忽略某些东西。当然,如果我试图将param作为Fooable传递,那么我最终会将它作为一个Enum来对待它,这不仅仅是没有收获我现在甚至都不安全。见如下:

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

我有什么东西可以忽略或是

Enum<? extends Fooable>

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

我对Java比较陌生,我仍然试图像C或C ++一样使用它,所以如果我把它当作锤子而不是锯或者忽略一些简单的东西,请随意指出:)< / p>

2 个答案:

答案 0 :(得分:20)

这意味着T扩展了Enum并实现了Fooable:

<T extends Enum<T> & Fooable>

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

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

答案 1 :(得分:1)

你有一个选择是将你需要的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作为参数类型,而不必担心任何常规内容。