关于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 <: TS :> 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> {
}

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

链接地址: http://www.djcxy.com/p/28861.html

上一篇: Difficult condition to understand on Java Specification

下一篇: Why does JavaScript show me one day before my set date?