首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通配符的类型擦除

通配符的类型擦除
EN

Stack Overflow用户
提问于 2021-04-26 13:15:37
回答 1查看 29关注 0票数 0

给定这些代码行,它们是如何被类型擦除的?

我理解这个例子,它是这样的(如果我错了,请纠正我!):

代码语言:javascript
复制
List<String> l = new ArrayList<>();
// type erased to:
List l = new ArrayList();

但是对于这两个人呢?

代码语言:javascript
复制
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,与泛型的整个类型擦除混淆。

EN

回答 1

Stack Overflow用户

发布于 2021-04-26 13:36:13

如果你有一个参数化的类型(简单地说,一个类型的末尾是<>),它总是擦除成非参数化的类型,所以List<Integer>List<T>List<? extends Integer>List<? extends T>都擦除成List。在<>中放入什么内容并不重要。

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

代码语言:javascript
复制
class Foo<T extends Integer> {
    private T bar;
}

bar的类型将擦除为Integer

代码语言:javascript
复制
// after erasure
class Foo {
    private Integer bar;
}

类型参数删除到其(第一个)约束的删除。T extends Integer不是一个特别有用的约束,所以下面是另一个示例:

代码语言:javascript
复制
class Foo<T extends Comparable<T>> {
    private T bar;
}

擦除到:

代码语言:javascript
复制
class Foo {
    private Comparable bar;
}

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

进一步阅读:Java Language Specification section 4.6

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67261175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档