在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节} link
答案 0 :(得分:3)
条件的第一部分要求S <: T
或S :> T
,即一个类必须从另一个类继承;否则会出现编译时错误。所以你的基本设置如下:
class T {
}
class S extends T {
}
到目前为止一切顺利:您可以将S
转换为T
,因为这两个类之间存在正确的子类关系。
现在让我们看看条件的第二部分:这两个类必须具有不同的超类型。由于只允许一个超类,因此常见的超类需要是一个接口。以下是如何打破规则第二部分的一个示例:
// X is List<String>
class T implements List<String> {
}
// Y is List<Integer>
class S extends T implements List<Integer> {
}
X
和Y
的删除需要实现List<???>
,但必须在不同类型上对列表进行参数化。这会导致编译时错误,因为S
无法满足List<String>
和List<Integer>
接口。