繁体   English   中英

通配符的类型擦除

[英]Type Erasure for wildcards

鉴于这些代码行,它们是如何被擦除的?

我知道对于这个,它如下(如果我错了,请纠正我:):

List<String> l = new ArrayList<>();
// type erased to:
List l = new ArrayList();

但是这两个人呢?

List<? extends Integer> l = new ArrayList<>();
// Does it get erased to:
List<Integer> l = new ArrayList<>(); ?
List<Object> l = new ArrayList<>();  ?
List l = new ArrayList();            ?

// Assume some generic class
List<? extends T> l = new ArrayList<>();
// Does it get erased to:
List<T> l = new ArrayList<>();       ?
List<Object> l = new ArrayList<>();  ?
List l = new ArrayList();            ?

如果? extends Integer ? extends Integer被擦除到Integer ,为什么它不被完全擦除到Object ,因为List<Integer>被擦除到List 还是我在List<Object>List之间感到困惑?

PS,与 generics 事物的整个类型擦除混淆。

如果你有一个参数化类型(简单来说,一个以<>结尾的类型),它总是擦除为非参数化类型,所以List<Integer>List<T>List<? extends Integer> List<? extends Integer>List<? extends T> List<? extends T>所有擦除到List 你在<>中放了什么并不重要。

您可能将此与类型参数的擦除方式混淆了。 如果你有一个类型参数,比如这里的T

class Foo<T extends Integer> {
    private T bar;
}

bar的类型擦除为Integer

// after erasure
class Foo {
    private Integer bar;
}

类型参数擦除到它们的(第一个)约束的擦除。 T extends Integer不是一个特别有用的约束,所以这里有另一个例子:

class Foo<T extends Comparable<T>> {
    private T bar;
}

擦除到:

class Foo {
    private Comparable bar;
}

T擦除到Comparable<T>的擦除。 Comparable<T>擦除为Comparable ,因此bar的类型是Comparable

进一步阅读: Java 语言规范第 4.6 节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM