[英]How does the Java compiler perform type erasure for lower bounded wildcards?
[英]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.