10

我正在尝试拥有一组扩展通用接口的枚举,例如:

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 传递,那么我最终将其转换为将其视为枚举,这不仅没有收获,我现在甚至都不安全。请参阅以下内容:

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

有什么我忽略的或者是

Enum<? extends Fooable>

与我得到的“好”解决方案一样接近吗?

我对 Java 比较陌生,并且仍然在尝试像 C 或 C++ 一样使用它,所以如果我把它当作锤子而不是锯子来对待,或者忽略一些愚蠢简单的东西,请随时指出:)

4

2 回答 2

20

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

<T extends Enum<T> & Fooable>

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

<T extends Enum<T> & Fooable> void bar(T fe) {
    fe.ordinal();
    fe.someCommonMethod();
}
于 2012-08-10T21:55:44.887 回答
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其用作方法签名中的参数类型,而不必担心任何通用的东西。

于 2012-08-10T22:20:28.800 回答