首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java规范难以理解的条件

Java规范难以理解的条件
EN

Stack Overflow用户
提问于 2015-09-03 18:41:47
回答 1查看 142关注 0票数 7

在阅读Java SE规范中的参考类型转换时:

给定编译时引用类型S(源)和编译时引用类型T(目标),如果由于下列规则而没有编译时错误,则存在从S到T的转换。

我不断发现以下几种情况:

如果S是类类型:如果T是类类型,则|S| <: |T||T| <: |S|。否则,会发生编译时错误. 此外,如果存在T的超型X和S的超型Y,使得X和Y都是明显不同的参数化类型(§4.5),并且X和Y的擦除是相同的,则会发生编译时错误。

有人能给我举个例子吗?

编辑:

要进一步澄清我引用的这篇文章,请参阅关于这个链接的5.5.1节

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 19:08:26

条件的第一部分要求S <: TS :> T,即一个类必须继承另一个类,否则会出现编译时错误。所以您的基本设置如下所示:

代码语言:javascript
复制
class T {
}
class S extends T {
}

到目前为止,还可以将S转换为T,因为这两个类之间有一个正确的子类关系。

现在让我们看看条件的第二部分:这两个类必须有不同的超级类型。由于只允许一个超类,所以常见的超级类型需要是一个接口。下面是如何打破规则第二部分的一个例子:

代码语言:javascript
复制
// X is List<String>
class T implements List<String> {
}
// Y is List<Integer>
class S extends T implements List<Integer> {
}

XY的擦除都需要实现List<???>,但是列表必须在不同类型上进行参数化。这会导致编译时错误,因为S无法同时满足List<String>List<Integer>接口。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32383174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档