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