我有一个函数,我正在尝试使用泛型进行转换,到目前为止我有:
public static <T extends Enum<T> & SomeInterface> EnumSet<T> convertToES(long val) {
EnumSet<T> es = EnumSet.noneOf(T.class);
for(T t : values()) {
if(t.getSomeProperty() > 0)
es.add(t);
}
return es;
}
其中 SomeInterface 有一个属性 getSomeProperty。
T.class 不工作,而且 values() 似乎也不工作。
以前我有:
public static EnumSet<SomeType> convertToES(long val) {
EnumSet<SomeType> es = EnumSet.noneOf(SomeType.class);
for (SomeType p : values()) {
if (p.getSomeThing())) > 0) {
es.add(p);
}
}
return es;
}
有没有办法让这个工作,或者这是不可能的?
最佳答案
这是因为 Java 通过erasure 实现泛型,所以 T
在运行时不存在。 Java 中的泛型只是一种语言工具,可帮助您避免犯太多可能在编译时被发现的错误。
解决方案是要求调用该方法的人将类本身作为真正的参数提供给您:
public static <T extends Enum<T> & SomeInterface> EnumSet<T> convertToES(
long val,
Class<T> tClass)
{
EnumSet<T> es = EnumSet.noneOf(tClass);
就 values()
而言,该方法存在于枚举类本身中,因此如果您已将代码移出该类,则需要获取另一个值方式:
for(T t : tClass.getEnumConstants()) {
....
关于java - 将此函数转换为使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106649/