泛型通配符(Wildcard)
Java 中的泛型通配符 ?
使用在泛型类型的声明中,表示未知的类型参数。通配符通常用在参数、字段、局部变量或者返回类型上,为泛型带来了更高的灵活性。泛型通配符主要分为三种形式:
-
无界通配符(Unbounded Wildcard)
?
:- 表示任意类型。如果你想使用泛型类但又不关心具体的类型参数,这时可以使用无界通配符。
- 例如,
List<?>
表示“具有任何类型的对象列表”。
-
有界通配符(Bounded Wildcard):
- 有界通配符包括上界通配符
? extends Type
和下界通配符? super Type
。 - 上界通配符
? extends Type
表示该通配符可以是 Type 或其子类。这限制了未知类型的上界。- 例如,
List<? extends Number>
可以是 Number 或其任何子类的列表。
- 例如,
- 下界通配符
? super Type
表示该通配符可以是 Type 或其父类。这限制了未知类型的下界。- 例如,
List<? super Integer>
可以是 Integer 或其任何父类的列表,包括 Number 或 Object。
- 例如,
- 有界通配符包括上界通配符
泛型方法
泛型方法允许在方法声明上指定类型参数,这样,即使在非泛型类中,方法也能是泛型的。泛型方法对于创建独立于类的泛型代码非常有用。在方法返回类型之前声明类型参数,使得该方法能够独立于类定义其自身的泛型类型。
基本结构:
public <T> List<T> fromArrayToList(T[] a) {return Arrays.stream(a).collect(Collectors.toList());
}
在这个例子中,<T>
在返回类型 List<T>
前面声明了一个名为 T 的类型参数。这表明该方法的返回类型和参数类型是相同的泛型类型 T,而这个类型由调用者确定。
泛型方法还可以有多个类型参数,只需在方法返回类型之前以逗号分隔即可定义。例如,public <T, U> void foo(T t, U u)
。
泛型方法的类型参数在调用方法时自动推断出来,不必显式指定(大多数情况下),例如 fromArrayToList(new Integer[] {1, 2, 3})
自动推断出 T 为 Integer
。
总的来说,泛型通配符和泛型方法是 Java 泛型编程中的强大工具,它们提供了编码时的弹性和类型安全性。通过泛型通配符,可以编写更加通用的代码;而泛型方法则允许在方法级别上实现类型抽象和类型安全。