繁体   English   中英

什么是“?”类型的擦除?

[英]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 eraseddoSomething(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) {      
}  

在这种情况下,不存在签名冲突。

? 在泛型中用作通配符。

它将被删除。

U extends Number表示上限是Number

List<?>不告诉上限是什么。

编辑:根据编辑后的问题,编译后,字节码仅包含在内。

public void doSomething(List argument) {      
}  
public void doSomething(List argument) {      
}  

泛型中的继承与Java中的继承几乎没有什么不同。

1. ? 在泛型中用作通配符。

例如:

假设动物是一类

ArrayList<? extends Animal> ArrayList<? extends Animal>表示ArrayList<? extends Animal> 任何类的实例

Erasure 过程中此过程是编译器在编译期间删除类和方法中的泛型的过程 ,以使泛型代码与未引入泛型时编写的代码兼容。

? U将在compilation期间被删除..因此在运行时它将不存在

暂无
暂无

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

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