难以理解Java规范

时间:2015-09-03 18:41:48

标签: 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节} link

1 个答案:

答案 0 :(得分:3)

条件的第一部分要求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>接口。