难以理解Java规范

前端之家收集整理的这篇文章主要介绍了难以理解Java规范前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读 Java SE规范中的参考类型转换时:

Given a compile-time reference type S (source) and a compile-time
reference type T (target),a casting conversion exists from S to T if
no compile-time errors occur due to the following rules.

我一直在寻找以下条件:

If S is a class type:
If T is a class type,then either |S| <: |T|,or |T| <: |S|. Otherwise,a compile-time error occurs.

Furthermore,if there exists a supertype X of T,and a supertype Y of S,such that both X and Y are provably distinct parameterized types
(§4.5),and that the erasures of X and Y are the same,a compile-time
error occurs.

有谁能举个例子说明这种情况?

编辑:

为了进一步澄清我引用的文章,请参阅本link的第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>和列表<整数>接口.

原文链接:https://www.f2er.com/java/128742.html

猜你在找的Java相关文章