java - 将此函数转换为使用泛型

标签 java generics

我有一个函数,我正在尝试使用泛型进行转换,到目前为止我有:

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/

相关文章:

java - 打开窗口/阶段JavaFX时调用代码

Java:具有泛型类的方法类型参数的工厂

java - 继承方法Object.clone()无法隐藏公共(public)抽象方法

java - Android Studio 调试器突出显示错误的行

java - 代码理解、逆向工程、最佳概念和工具。 java

java - 如何验证序数日期?

java - 将 LinkedList<Object> 转换为 LinkedList<Customer>

java - 从 TypeReference<E> 转换为 Class<E> 而无需强制转换 (Java)

generics - 使用泛型关联类型时,如何指示类型参数上的生存期约束?

java - 如何在intelliJ中生成签名的APK