[英]What is the type erasure of “?”?
如果我有以下方法:
public <U extends Number> void doSomething(List<U> l){
}
然后由于type erasure
,编译器将使其变为doSomething(List<Number> l)
。 对?
如果是这种情况,那么为什么不能与此一起声明以下内容:
public void doSomething(List<?> l){
}
这不是第二种方法,将其type erased
为doSomething(List<Object> l)
吗? 为什么这两种方法会出现相同擦除的编译器错误?
你的想法是错误的。 擦除导致这两种方法都具有此签名( List
参数类型被擦除):
public void doSomething(List l) {
}
因此,碰撞。 您认为可以做到的是:
public <U extends Number> void doSomething(U argument) {
}
public <U extends Object> void doSomething(U argument) {
}
在这种情况下,擦除后,方法签名将变为此(在删除U
之后)
public void doSomething(Number argument) {
}
public void doSomething(Object argument) {
}
在这种情况下,不存在签名冲突。
1. ?
在泛型中用作通配符。
例如:
假设动物是一类 。
ArrayList<? extends Animal>
ArrayList<? extends Animal>
表示ArrayList<? extends Animal>
任何类的实例
在Erasure
过程中 , 此过程是编译器在编译期间删除类和方法中的泛型的过程 ,以使泛型代码与未引入泛型时编写的代码兼容。
那?
和U
将在compilation
期间被删除..因此在运行时它将不存在
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.