gpt4 book ai didi

Java泛型和覆盖

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:18 25 4
gpt4 key购买 nike

为什么会出现以下情况:

public class one{
public <T extends Foo> Bar<Foo> function1() {}
public Bar<Foo> function2(){}
}
public class two<F extends Foo> extends one{
public Bar<F> function1(){} //Doesn't throw an error
public Bar<F> function2(){} //Throws an error
}

通过说<T extends Foo>我是说 Foo 可以被父类(super class)型覆盖吗?

注意:我的问题不是为什么function2()抛出错误...但为什么 function1() 不会抛出错误。

最佳答案

这可能是一个编译器错误。

Two.function1的原因被认为是 One.function1 的重写方法来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2

the signature of Two.function1 is the same as the erasure of the signature of One.function1.

这是为了允许遗留子类型(二)在父类(super class)型(一)泛化后仍然可以编译。

之后javac需要检查返回类型:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.3

If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.5

R1 is either a subtype of R2 or R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9), or R1 = |R2|

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.9

There is an unchecked conversion from the raw class or interface type (§4.8) G to any parameterized type of the form G.

未经检查的转换不适用于此处 R1=Bar<F>, R2=Bar<Foo> .这就是 Javac 报告 function2 的原因返回类型冲突。

Javac 应该为 function1 报告同样的错误.我猜在前面的步骤中,javac 删除了 One.function1。 ,即 Bar function1() ,并错误地使用该版本来检查 Two.function1 - 这里 R2=Bar ,因此 R1R2 的子类型 ($4.10.2) ,因此返回类型是兼容的。 (但是,如果该理论是正确的,则不应出现“未经检查”的警告)

关于Java泛型和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644688/

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