关于Java规范的理解困难
同时阅读Java SE规范中的引用类型转换:
给定编译时引用类型S(源)和编译时引用类型T(目标),如果由于以下规则而没有发生编译时错误,则从S到T存在转换转换。
我一直在寻找以下几种情况:
如果S是一个类的类型:如果T是一个类的类型,则是|S| <: |T|
|S| <: |T|
,或|T| <: |S|
|T| <: |S|
。 否则,会发生编译时错误。
此外,如果存在T的超类型X和S的超类型Y,使得X和Y都是可证明的不同参数化类型(§4.5),并且X和Y的删除相同,则编译时发生错误。
任何人都可以给我一个这种情况的例子吗?
编辑:
有关本文引用的文章的进一步说明,请参阅本链接的第5.5.1节
条件的第一部分要求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>
接口。
上一篇: Difficult condition to understand on Java Specification
下一篇: Why does JavaScript show me one day before my set date?