gpt4 book ai didi

java - ClassCastException :java. lang.Class 无法转换为 java.lang.reflect.ParameterizedType

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:29 27 4
gpt4 key购买 nike

我尝试使用泛型主要是为了练习和我的一点想法。目前我有一个问题:ClassCastException:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType。我发现的大多数主题都来自发布非常具体代码的用户。这让我真的很难理解。我试图使问题尽可能简单,但仍然与我的实际问题有关。我希望有人能提供帮助。

酒吧类:

class Bar { }

Foo 类:

class Foo<T> {

ArrayList<Object> list;

Foo(int initialCapacity) {
init(initialCapacity);
}

void init(int initialCapacity) {
list = new ArrayList<Object>(initialCapacity);

for (int i = 0; i < initialCapacity; i++) {
try {
list.add(((Class)((ParameterizedType)this.getClass().
getGenericSuperclass()).getActualTypeArguments()[0]).newInstance());
}
catch (InstantiationException e) {

}
catch (IllegalAccessException e) {

}
}


}

}

使用:

Foo<Bar> com = new Foo<Bar>(100);

最佳答案

您似乎对 Java 中的泛型感到困惑。

Java 实现泛型的方式与在 C# 中的实现方式不同:您无法在运行时检索泛型类型的类型信息,因为它在编译后根本不保存(参见:type erasure )

这意味着如果我声明一个类型为 List<MyObject> 的变量,那么我无法知道它是否是一个 MyObject 列表,因为类型信息丢失了,而这个列表的类只是 List,它没有实现 ParameterizedType。

唯一保存泛型类型信息的时间是在类型定义的编译时已知时:

public class MyList extends List<MyObject> {}

这里,MyList.class.getGenericSuperclass() 应该实现 ParameterizedType。恐怕你在这里尝试做的事情是不可能的,或者至少,如果在继承 Foo 的类上调用 init,它可能是有效的,例如:

public class StringFoo extends Foo<String> {
public StringFoo(int initialCapacity) {
super(initialCapacity);
}
}

StringFoo foo = new StringFoo(100);

关于java - ClassCastException :java. lang.Class 无法转换为 java.lang.reflect.ParameterizedType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829146/

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