1

如果我有以下方法:

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)?为什么这两种方法会出现相同擦除的编译器错误?

4

3 回答 3

8

你的想法是错误的。擦除导致两种方法都具有此签名(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) {      
}  

在这种情况下,没有签名冲突。

于 2012-08-15T15:29:52.387 回答
2

?在泛型中用作通配符。

它将被删除。

U extends Number告诉上限是数字

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

编辑:基于编辑的问题,编译后,字节码只包含。

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

泛型中的继承与我们所知的 java 中的继承几乎没有什么不同。

于 2012-08-15T15:28:13.910 回答
1

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

例如:

假设Animal 是一个 Class

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

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

所以?并且U将在compilation一段时间内被删除..所以在运行时它将不存在

于 2012-08-15T15:31:58.947 回答