如何引用从泛型类实现接口的枚举

时间:2014-12-30 14:00:54

标签: java enums

从这个背景来看:

enum Traits {
   TA,
   TB
}

interface Intrfc {
   Traits getTraits();
}

// How to add some precision about E which implements Traits?
abstract class Base<E extends Enum<E>> {

   void func( E e ) {
      final Traits t = ((Intrfc)e).getTraits(); //<<<<< To avoid this cast?
   }
}

enum X implements Intrfc {
   A( Traits.TA ),
   B( Traits.TA ),
   C( Traits.TB ),
   ;
   private Traits traits;

   X( Traits t ) {
      traits = t;
   }

   @Override
   public Traits getTraits() {
      return traits;
   }
}

class Concrete extends Base<X> {

   void f() {
      func( X.B );
   }
}

我希望通过使用EBase<E>中声明E implements Traits来避免演员表,但我不知道要使用的语法。

1 个答案:

答案 0 :(得分:1)

泛型上下文中的extends关键字可以表示正常的extendsimplements含义。因此,要将type参数声明为接口的子类型,您可以执行以下操作:

abstract class Base<E extends Intrfc> {

要有多个边界(枚举和接口的子类型):

abstract class Base<E extends Enum<E> & Intrfc> {