gpt4 book ai didi

java - 意外的类型删除

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:04 26 4
gpt4 key购买 nike

我对泛型有疑问,我认为是类型删除,同时试图反射(reflect)一些通用信息。

我正在使用基于 http://www.artima.com/weblogs/viewpost.jsp?thread=208860 的类进行反射(reflection),但这不是问题所在。

下面的代码演示了这个问题:

private <U extends MyClass1> U doSomething(MyClass2<U> p) {
Class<U> classIWant = null;
for (Class<?> c : GenericTypeUtils.getTypeArguments(MyClass2.class, p.getClass())) {
if (MyClass1.class.isAssignableFrom(c)) {
classIWant = c.asSubclass(MyClass1.class);
break;
}
}
}

可惜线

classIWant = c.asSubclass(MyClass1.class);

显示如下错误

java: incompatible types
required: java.lang.Class<U>
found: java.lang.Class<capture#4 of ? extends MyClass1>

这让我很困惑。 U 扩展了 MyClass1,因此 U 是 MyClass1。

显然这里有一些我不理解的类型删除 - 任何人都可以帮忙吗?顺便说一句,这是 Java 1.7.0_40

谢谢

康拉德温彻斯特

最佳答案

方法asSubclass()是这样实现的

public <U> Class<? extends U> asSubclass(Class<U> clazz) {
if (clazz.isAssignableFrom(this))
return (Class<? extends U>) this;
else
throw new ClassCastException(this.toString());
}

返回类型为 Class<? extends U> .请注意,您的 UUasSubclass方法是完全不相关的类型变量。

所以方法 asSubclass()返回一个声明为 Class 类型的值U 的一些未知子类型, 其中U在这种情况下是 MyClass1 .

您正在尝试将此值分配给类型为 Class 的变量与 MyClass1 的一些已知 亚型.编译器不能保证它们匹配,因此不允许编译。

如果愿意,您可以转换返回值,但最终可能会得到 ClassCastException在运行时,如果类型不匹配。

关于java - 意外的类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772752/

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