如何从Class <t>推断出T的方法

时间:2017-05-23 14:54:22

标签: java generics enums

我有一个实现接口的枚举。枚举:

enum MyEnum implements MyInterface {
    ONE, TWO, THREE;

    @Override
    public MyEnum getFirst() {
        return ONE;
    }
}

接口:

interface MyInterface<T extends Enum<T>> {
    T getFirst();
}

我还有一个带边界的泛型类:

class MyClass <T extends Enum<T> & MyInterface> {
   private T firstElement;
   private Class<T> enumType;

   MyClass (Class<T> enumType) {
      this.enumType = enumType;
   }
}

所以主要的想法是将任何enum(实现MyIterface)传递给构造函数,然后使用它的常量。这对我有用。但我也希望将第一个元素存储到firstElement私有字段中。我试过这样的事情:

firstElement = ((MyInterface)enumType).getFirst();

但仍然没有成功。我无法将java.lang.Class<T>投射到MyInterface。任何想法如何实现这一目标?提前谢谢!

UPDATE :我的问题不在于如何获取第一个枚举常量。我知道.ordinal().values()[0];。我想创建可重用的泛型类,并将其用于任何枚举,由某些界面标记。 好吧,让它不是getFirst()方法。设为getDefault()

4 个答案:

答案 0 :(得分:1)

从您的上下文中我认为您需要getFirst(),因为您想获得枚举的第一个值。但是,您根本不需要getFirst()。所有你需要的是:

class <T extends Enum<T> & MyInterface> MyClass {
   private T firstElement;
   private Class<T> enumType;

   MyClass (Class<T> enumType) {
      this.enumType = enumType;
      firstElement = enumType.getEnumConstants()[0];
   }
}

您可以删除所有课程中的所有getFirst()

答案 1 :(得分:1)

您只能在实现getFirst但不在其类上的枚举对象上调用MyInterface。你可以写:

firstElement = enumType.getEnumConstants()[0].getFirst();

答案 2 :(得分:1)

我认为您可以使用os.kill(os.getpid(), signal.CTRL_C_EVENT)作为构造函数的参数而不是Supplier<T>

Class<T>

该投射会抛出警告,但可以安全地予以抑制,因为class MyClass<T extends Enum<T> & MyInterface<T>> { private T firstElement; private Class<T> enumType; @SuppressWarnings("unchecked") MyClass (Supplier<T> enumSupplier) { T actualEnum = enumSupplier.get(); this.enumType = (Class<T>) actualEnum.getClass(); this.firstElement = actualEnum.getFirst(); } } 将返回Supplier<T>的实例,T同时为T和{{1 }},因此Enum<T>的类始终为MyInterface<T>

我想建议您进行一些更正:由于actualEnum是通用的,因此您应始终将其与通用类型一起使用(这就是我将Class<T>声明为MyInterface的原因})。 MyClass也是如此:它应该被定义为MyClass<T extends Enum<T> & MyInterface<T>>

通过上述更改,您现在可以创建MyEnum的实例,如下所示:

MyEnum implements MyInterface<MyEnum>

答案 3 :(得分:0)

{{1}}

所以,使用上面的设计,我认为你可以将任何枚举(实现MyInterface)传递给构造函数,然后使用它的常量。&#34;