gpt4 book ai didi

java - 如何从 Class 推断 T 的方法

转载 作者:行者123 更新时间:2023-11-29 04:30:00 25 4
gpt4 key购买 nike

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

enum MyEnum implements MyInterface {
ONE, TWO, THREE;

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

接口(interface):

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 中私有(private)领域。我试过这样的事情:

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

但是还是没有成功。我不能投 java.lang.Class<T>MyInterface .任何想法如何实现这一目标?提前致谢!

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

最佳答案

我想你可以使用 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都是Enum<T>MyInterface<T> , 所以类 actualEnum永远是Class<T> .

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

完成上述更改后,您现在可以创建 MyClass 的实例如下:

MyClass<MyEnum> myClass = new MyClass<>(() -> MyEnum.THREE); // Or ONE or TWO

System.out.println(myClass.firstElement); // ONE

关于java - 如何从 Class<T> 推断 T 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com