给定这些代码行,它们是如何被类型擦除的?
我理解这个例子,它是这样的(如果我错了,请纠正我!):
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被擦除为Integer,那么既然List<Integer>被擦除为List,为什么不完全擦除到Object呢?或者我把List<Object>和List搞混了
PS,与泛型的整个类型擦除混淆。
发布于 2021-04-26 13:36:13
如果你有一个参数化的类型(简单地说,一个类型的末尾是<>),它总是擦除成非参数化的类型,所以List<Integer>,List<T>,List<? extends Integer>,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。
https://stackoverflow.com/questions/67261175
复制相似问题