java - 尝试获取泛型类型类时出现 ClassCastException

标签 java generics reflection

我尝试使用 this answer 中给出的代码.我这样做了:

public class ListClass<T> {
  private class ObjectFactory<T> {
    //This should the the class of generic type T which is what I need
    public final Class<T> cls;
    @SuppressWarnings ("unchecked")
    public ObjectFactory()
    {
      //This three lines are from the linked answer - I don't really understand them
      Type type = getClass().getGenericSuperclass();
      ParameterizedType paramType = (ParameterizedType) type; //java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
      cls = (Class<T>) paramType.getActualTypeArguments()[0]; 
    }
    public T createNew(... some parameters ...) {
      return (T)new Expression(cls, "new", new Object[]{... some parameters ...}).getValue();
    }
  }
  public final ObjectFactory<T> factory = new ObjectFactory<T>();

  public generateItem() {
    //let add() be method that adds item of type T to this list
    this.add(factory.createNew(... some parameters ...));
  }
}

我哪里错了?

最佳答案

此技术仅在使用如下具体参数对类进行参数化时才有效:

class Sub extends Super<String> {}

然后通过扩展:

new Super<String>() {}

但不是这样:

class Sub<T> extends Super<T> {}

不是这样的:

<T> Super<T> m() {
    return new Super<T>() {};
}

使用能力getActualTypeArguments是类的属性,而不是实例,因此类需要实际类型参数才能使用它。


根据您的编辑,我建议您为此创建一个辅助例程:

static <T> Class<T> getActualTypeArgument(Class<?> clazz, int i) {
    Type superclazz = getClass().getGenericSuperclass();
    ParameterizedType paramType = (ParameterizedType) superclazz;

    @SuppressWarnings("unchecked")
    final Class<T> actual =
        (Class<T>) paramType.getActualTypeArguments()[i];
    return actual;
}

然后在 ListClass 上使用它:

class ListClass<T> {
    private ObjectFactory<T> factory = new ObjectFactory<T>(
        getActualTypeArgument(this.getClass(), 0));
}

并创建 ListClass例如以下方式:

ListClass<GameObject> list =
    new ListClass<GameObject>() {};

也考虑传递 Class<T>在:

class ListClass<T> {
    private ObjectFactory<T> factory;

    ListClass<T>(Class<T> type) {
        factory = new ObjectFactory(type);
    }

    static <T> ListClass<T> of(Class<T> type) {
        return new ListClass<T>(type);
    }
}

ListClass<GameObject> list =
    ListClass.of(GameObject.class);

关于java - 尝试获取泛型类型类时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29988180/

相关文章:

java - Java中未知类型的排序列表

generics - 对位向量使用泛型时,不能应用二元运算 !=

java - 是否有更好的方法来分区列表和批量处理以更改源列表

java - 链接/元素扩展的 JAX-RS 实现?

java - Openstreetmap 如何使用 Java 增加缩放粒度

c# - 如何根据名称获取属性值

swift - 如何在 Swift 中使用反射获取所有类初始化器

java - 在prepareCall后遇到符号\"CLOSE\"

java - 在运行时确定泛型的翻译类型

java - 使用Java时如何在不使用try-catch的情况下忽略可能的ClassNotFoundException