难以理解Java规范

Rod*_*igo 7 java specifications

阅读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

das*_*ght 3

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

class T {
}
class S extends T {
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利:您可以强制转换ST,因为两个类之间存在适当的子类关系。

现在让我们看看条件的第二部分:两个类必须具有不同的超类型。由于只允许有一个超类,因此公共超类必须是一个接口。以下是如何违反规则第二部分的一个示例:

// X is List<String>
class T implements List<String> {
}
// Y is List<Integer>
class S extends T implements List<Integer> {
}
Run Code Online (Sandbox Code Playgroud)

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