7

我正在通过JLS 7了解类型转换Section 5.5.1

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

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

他们在第 4.10 节中明确了 S 和 T 是否是两种类型,那么

  • S :> T表示 S 是 T 的超类型
  • S > T表示 S 是 T 的适当超类型,这意味着S :> TS != T

我无法找到|S|的含义 . 请帮助我理解|S|是什么意思 ? 它是指属性的数量和类型还是其他什么。我试图在JLS本身中搜索它,但找不到它的含义。提前致谢。

4

2 回答 2

3

我无法为类型擦除的文档提供更好和更不正式的解释。在您的情况下(类转换)“如果 T 是类类型,则 |S| <: |T| 或 |T| <: |S|。否则,会发生编译时错误。” 意味着,在类型擦除之后,如果泛型类型参数处于“类-子类关系”中,则类转换是合法的。简单的例子:


    static class Bar {}
    static class FooBar extends Bar {}

    public static void main(String[] args) {

        List<FooBar> foobarList = (List<FooBar>) newList(Bar.class);
        List<Bar> barList = (List<Bar>) newList(FooBar.class);

        System.out.println("No cast class exception :)");
    }

    private static<T> List<?> newList(Class<T> clazz) {
        return new ArrayList<T>();
    }

于 2013-06-15T09:48:27.650 回答
0

4.6. 类型擦除

我们写 |T| 用于擦除类型 T。

因此|S|是类型 S 的擦除。

于 2021-07-22T06:32:45.240 回答