当前位置: 首页 > 面试题库 >

捕获Java中的转换问题,JLS的WRT协调以及实际的JDK行为

尉迟冯浩
2023-03-14
问题内容

给定以下两个类定义

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

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

考虑以下类型声明:

C1<? extends C2<String>> c;

在JDK-8u45编译没有问题,但是如果我们考察了采集转换规范,它出现(我)这个声明
应该 导致编译时错误。

特别是,新型变量捕获的上限T#1由给出glb(Bi, Ui[A1:=S1,...,An:=Sn]),在这种情况下,Bi解析为通配符边界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>都是类类型,而不是接口类型,但是它们中的任何一个都不是另一个的子类型。

在相交类型本身的定义中,这种(明显的)违反规则的行为可能会更加清楚。

我确定这不是错误,我只是在某个地方犯了一些简单的错误…
如果是错误,我希望可以将其视为JLS中的错误,而不是JDK中的错误,这样我可以期望能够安全地模拟行为…

谢谢你的帮助!

编辑: 昨天与Radiodef交谈后,我使自己确信,这个问题(或至少一种看待它的方式)是C2<String> 可以有效地认为
是该问题的子类型C1<T#1>,因为T#1 永远
只能被满足C2<String>,因此可以被认为与之相等,但是包含和子类型化规则对所写的这种关系没有任何了解,因此JLS将无法识别该子类型并且应该失败。

但是,如果采用稍微复杂一点的C1<? extends C2<?>> d;,它会比较棘手。问题是相似的,但是构成捕获上限的交集类型显示为C2<?> & C1<T#2>,其中似乎无法通过与上述相同的推理得出解决方案


问题答案:

毛里齐奥对Compiler-dev的回答最好地回答了这个问题。

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

可以在此处找到相关的错误。

非常感谢所有对此答案做出贡献的人。



 类似资料:
  • 本文向大家介绍eclipse+jdk安装以及会遇到的问题及解决方法,包括了eclipse+jdk安装以及会遇到的问题及解决方法的使用技巧和注意事项,需要的朋友参考一下 今天电脑系统崩了,重做了系统,对于我这个非计算机专业的来说,记录一下问win10系统安装eclipse软件和JDK以及配置环境变量时遇到的问题也是好的,希望也可以帮助到刚入行的你。 jdk下载地址: 链接: https://pan.

  • 我被这个问题困了2天。我只想提取图像中标记的数据,以便通过XSLT进行转换。我在这个问题中也给出了XML文件。抱歉,如果这是一个非常愚蠢的问题。类似的路径,如//partyinformation/buyer/contact//name在文档中工作。但是//partyinformation/买主/联系人//姓名不起作用 到目前为止我已经试过了, //partyinformation/buyer/co

  • 本文向大家介绍Java中string和int的互相转换问题,包括了Java中string和int的互相转换问题的使用技巧和注意事项,需要的朋友参考一下 int -> String 核心:s=i+""; String -> int 核心:i=Integer.parseInt(s); 这个方法的测试结果就是20171091。 以下参考: java中string和int互相转化 1 如何将字串 Stri

  • 场景: 如下图, 红框中的数据是后台传过来的时间, 因为是一串字符串, 在 ts 中我就没办法对这个时间做处理 (例如转成数字、获取年月日等) 对应的 ts 代码 问题简述1: 我在model中定义的 createTime 和 updateTime, 都是 number 类型, 并且我在接收 res 时候已经指定接收对象是一个 Icon 类型的数组了, 但为什么我最终 res.icons[0].c

  • 我在使用这个try/catk语句时遇到了麻烦。我试图用它抛出一条错误消息,上面写着,“请输入一个整数!”如果用户输入一个字母。我使用的第一个成功了,但是它最终需要两行用户输入,而不仅仅是一行,所以它基本上跳过了一个应该问的问题。在那之后,其他的都不起作用,它们只是被完全跳过。我还需要对用户输入做同样的事情,如果用户在字母应该在的地方输入整数,它会抛出一条错误消息,上面写着“请输入字符串!”。我知道