gpt4 book ai didi

java - 捕获 Java 中的转换问题、JLS 的 WRT 协调和实际的 JDK 行为

转载 作者:太空狗 更新时间:2023-10-29 22:58:41 27 4
gpt4 key购买 nike

给定以下两个类定义:

class C1<T extends C1<T>> {}

class C2<U> extends C1<C2<U>> {}

考虑以下类型声明:

C1<? extends C2<String>> c;

这在 JDK-8u45 中编译得很好,但如果我们检查 specification for capture conversion ,(在我看来)这个声明应该导致编译时错误。

特别是新类型变量捕获的上界T#1glb(Bi, Ui[A1:=S1,...,An:=Sn]) 给出, 在这种情况下 Bi解析为通配符绑定(bind) C2<String>Ui[A1:=S1,...,An:=Sn]解析为 C1<T#1> .

由此,glb(C2<?>, C1<T#1>)解析为交集类型 C2<String> & C1<T#1> ,这是无效的,因为 C2<String>C1<T#1>都是类类型,不是接口(interface)类型,但它们都不是另一个的子类型。

这种(明显的)违反规则的行为可能在 definition of the intersection type 中更加明确本身。

我确定这不是一个错误,我只是在某个地方犯了一些简单的错误... 如果它是一个错误,我希望它可以被认为是 JLS 中的一个错误,而不是JDK,这样我就可以安全地模拟行为......

感谢您的帮助!

编辑:在昨天与 Radiodef 交谈后,我说服自己这个问题(或者至少是一种看待它的方式)是 C2<String> 可以有效地认为C1<T#1>的子类型,因为 T#1 只能永远C2<String> 满足等可以被认为等于它,但是包含和子类型化规则不理解这种关系,因此 JLS 将无法识别子类型并且应该失败...

如果您采用稍微复杂一点的情况 C1<? extends C2<?>> d; ,虽然,它更棘手。问题类似,但形成捕获上限的交集类型为 C2<?> & C1<T#2>。 ,似乎无法通过与上述相同的推理得出解决方案。

最佳答案

Maurizio's response on compiler-dev 最好地回答了这个问题.

(TL;DR javac 确实与此处的规范不一致,最佳解决方案可能介于两种方法之间)

相关错误 can be found here .

非常感谢所有为这个答案做出贡献的人。

关于java - 捕获 Java 中的转换问题、JLS 的 WRT 协调和实际的 JDK 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788366/

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