Java语言规范:符号的含义| S |

时间:2013-06-15 08:23:05

标签: java types casting type-conversion jls

我正在浏览 JLS 7 以了解类型转换 Section 5.5.1

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

  • 如果T是类类型,则 | S | &lt ;: | T |,或| T | &lt ;: | S | 。否则,编译时 发生错误。

他们明确表示S和T是 Section 4.10 中的两种类型,然后

  • S:> T 表示S是超级类型的T
  • S> T 表示S是T的适当超类型,其暗示 S:> T S!= T

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

2 个答案:

答案 0 :(得分:2)

我无法提供类型擦除文档的更好和更不正式的解释。 在你的情况下(类转换)“如果T是类类型,那么| S |&lt ;: | 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>();
    }

答案 1 :(得分:0)

4.6. Type Erasure

<块引用>

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

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