java泛型相关的问题

有一个方法, 需要传入所有类型的Number集合, 包括 List<Integer>, List<Double>, 设计一下方法签名

不能使用这种方法签名doSomething(List<Number> numbers) , 会报 doSomething(java.util.List<Number> numbers) can't applied to java.util.List<Integer>

使用以下两种方法签名都可以编译通过

1
2
doSomething(List<? extends Number> numbers)
doSomething(List numbers);

建议使用第一种, 这样对方法的参数没有做侵入, 让调用明确知道需要传入List<Number >

两个擦出后一样的方法签名编译能否成功, 比如 void do(List<Integer> numbers), void do(List<Double> numbers)

不会, 编译器会认为这两个方法签名一样, both method has same erasure

泛型赋值的问题

List<Integer> 是不能赋值给 List<Number>的, 但可以赋值给 List<? extends Number>, eg:

1
2
List<Integer> integers = new ArrayList<>();
List<? extends Number> numbers = integers;