【问题标题】:Difficult condition to understand on Java SpecificationJava 规范难以理解的情况
【发布时间】:2015-09-03 18:41:47
【问题描述】:

在阅读 Java 的 SE 规范中的引用类型转换时:

给定一个编译时引用类型 S(源)和一个编译时 引用类型 T(目标),存在从 S 到 T 的强制转换,如果 由于以下规则,不会发生编译时错误。

我不断发现以下情况:

如果 S 是类类型: 如果 T 是类类型,则为 |S| <: |T| 或 |T| <: |S|。否则,会发生编译时错误。

此外,如果存在 T 的超类型 X 和 S 的超类型 Y,则 X 和 Y 都可证明是不同的参数化类型 (§4.5),并且 X 和 Y 的擦除是相同的,编译时 发生错误。

谁能给我一个这种情况的例子吗?

编辑:

有关我引用的文章的进一步说明,请参阅link 上的第 5.5.1 节

【问题讨论】:

  • 您的引文断章取义,并且您没有提供指向您引用的相关部分的链接,因此:很难说。
  • 我担心我不能使用外部材料,所以我会编辑知道的。感谢您的评论

标签: java specifications


【解决方案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&lt;???&gt;,但列表必须在不同类型上参数化。这会导致编译时错误,因为S 无法同时满足List&lt;String&gt; 和List&lt;Integer&gt; 接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多