在 Java 泛型中,?
被称为通配符(wildcard),它代表了未知的类型。使用通配符可以增加代码的灵活性,允许在不知道具体类型的情况下操作泛型类或接口。通配符主要有以下几种形式:
-
无界通配符(Unbounded Wildcard):
- 使用形式为
?
,表示它可以是任何类型。 - 例如:
List<?> list
表示这个列表可以包含任意类型的元素,但是我们不能向这样的列表添加元素(除了null
),因为我们不知道列表实际存储的是哪种类型的数据。
- 使用形式为
-
上界通配符(Upper Bounded Wildcard):
- 使用形式为
? extends T
,这里的T
表示某个特定类型,extends
关键字表明通配符所代表的未知类型是T
类型或其子类型。 - 例如:
List<? extends Number>
可以接受List<Number>
,List<Integer>
,List<Double>
等类型的列表,但不能向这些列表中添加对象,因为编译器无法确定添加的对象是否符合列表的实际类型要求。
- 使用形式为
-
下界通配符(Lower Bounded Wildcard):
- 使用形式为
? super T
,这里的T
表示某个特定类型,super
关键字表明通配符所代表的未知类型是T
类型或其父类型。 - 例如:
List<? super Integer>
可以接受List<Integer>
,List<Number>
,List<Object>
等类型的列表。在这种情况下,我们可以向列表中添加Integer
类型的元素,因为这些列表都保证能接受Integer
类型的数据。
- 使用形式为
使用通配符可以使泛型更加通用和灵活,但同时也要注意保持类型安全。在处理泛型时,选择合适的通配符可以避免不必要的类型转换错误,并且提高代码的可读性和安全性。