我发现在声明变量和分配实例时都必须使用通用表单。我想问的问题是: 有没有变量和实例的类型可以不同? 像
List<Object> list = new ArrayList<Integer>();
答案 0 :(得分:1)
首先,您可以使用菱形运算符来推断右侧的类型:
List<Object> list = new ArrayList<>();
有没有变量和实例的类型可以不同?
Java中的泛型类型在运行时被擦除。这意味着实例没有泛型类型。该类型仅在编译时存在于变量上。
左侧和右侧的泛型类型不必完全相同,但是您必须使用通配符:
List<?> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Integer>();
使用这些通配符,您对对象的使用仍然非常有限。例如,您只能get
Number
List<? extends Number>
add
,但您不能Integer
新的List<Double>
(因为它可能是{1}}你知道的所有事情。)
如果要编写可以接受某些接口类型列表的方法,这仍然很有用:
boolean areAllPositive(List<? extends Number> numbers) { ... }