gpt4 book ai didi

java - Java中从子类实例调用的类的泛型方法返回实例的类的误解

转载 作者:行者123 更新时间:2023-11-30 06:25:09 25 4
gpt4 key购买 nike

例子:

interface S {}

interface SS extends S {}

abstract class A<T extends S> {
T get() {…}
}

abstract class B<BT extends SS> extends A<BT> {}

为什么 ((B)someInstanceOfB).get() 返回类型为 S 的对象(我们应该将其转换为 SS手动),当编译器可以确定返回的对象至少是 SS 类型时?

为什么编译器不进行隐式类转换以获得更清晰的代码?代码是 1.5+ 版本,这对编译器来说不是 secret 。 (已解决)

更新: 为什么编译器不编译 B 类,因为它隐含地具有方法 BT get() { return super.get(); } ?

这个问题在 Java 1.7+ 中解决了吗?

最佳答案

通过转换为 B你正在使用 a raw type .

使用原始类型会从对象中删除所有通用信息,无论它在哪里。

这意味着对于原始类型 B get方法看起来它返回一个S (因为这是类型参数 T 的删除(即运行时使用的实际类型)。

为避免这种情况,永远不要使用原始类型!它们专门用于向后兼容以及与遗留代码的交互。

转换为 B<? extends SS>相反。

不:这个问题可能永远不会在任何 future 版本的 Java 中“解决”,因为如果您正确使用泛型,它就不存在了。

关于更新:否,B 没有有方法BT get() .它有一个方法 T get()其中 T绑定(bind)到类型参数 BT它有一个下界 SS .但是由于在使用原始类型时会丢弃所有通用类型信息,T仍然回落到原始删除,即S .

规则 非常简单,基本上是说“当您使用原始类型时,它的行为就好像该类根本没有泛型”。然而,其含义并不总是显而易见的,就像在本例中一样。

关于java - Java中从子类实例调用的类的泛型方法返回实例的类的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036330/

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