Java泛型通配符详解(作用用法及3类通配符)

Java泛型通配符详解(作用用法及3类通配符)-mikechen

Java泛型通配符是Java泛型非常重要的组成部分,下面我就重点来详解Java泛型通配符@mikechen

Java泛型通配符定义

Java泛型通配符是用来表示一个泛型类型的未知实参的占位符,用于解决泛型之间引用传递问题的特殊语法。

 

Java泛型通配符作用

Java泛型通配符是一种特殊的语法,用于指定一个通用的类型,以便在泛型类、方法或接口中接受不同的类型参数。

通配符可以出现在方法参数、方法返回值、类的字段、局部变量等多种场景中。

通配符的作用在于使得泛型类型可以接受不同类型的参数,从而提高代码的重用性和灵活性。

 

Java泛型通配符用法

通配符有两种形式:

  • “?”
  • “? extends T”

1.第一类:”?”

通配符的语法是使用一个问号(?)来表示,可以用于表示任何类型。

List<?> list = new ArrayList<String>(); 

在上面的代码中,通配符<?>表示一个未知的类型,我们可以将ArrayList中的元素类型作为参数传递给List,而不必指定具体的类型。

 

2.第二类:”? extends T” 

“? extends T” 表示一个上界为 T 的通配符,它可以匹配 T 类型或 T 的任何子类。

public void printList(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
}

在上面的代码中,通配符<? extends Number>表示一个未知的类型,但它必须是Number或其子类。

 

Java泛型通配符分类

Java泛型通配符主要有以下三类:

Java泛型通配符详解(作用用法及3类通配符)-mikechen

分别是:无边界的通配符、固定上边界的通配符、固定下边界的通配符这三类Java泛型通配符,下面我分别一一来详解@mikechen

 

1. 无边界的通配符

无边界的通配符是指使用”?”来表示一个未知类型的占位符,没有任何约束条件。

它的语法形式为:

List<?> list = new ArrayList<>();

使用无边界通配符的好处是,可以将任何类型的对象放入泛型容器中,这使得代码更加灵活和可重用。

需要注意的是,使用无边界的通配符在编写代码时比较方便,但使用无边界的通配符也可能导致一些类型安全问题。

因为它可以匹配任何类型,所以可能会导致一些不安全的转换或者错误的操作,因此,在使用无边界的通配符时需要特别注意类型安全性问题。

 

2. 固定上边界的通配符

Java中的泛型通配符可以使用extends关键字指定一个上边界,这种通配符被称为固定上边界通配符。

固定上边界的通配符使用:”? extends T”来表示一个上界为T的通配符,它可以匹配T类型或T的任何子类。

例如:如果我们想要一个泛型类型的参数,它必须是Number类或其子类的实例,我们可以这样定义:

public void someMethod(List<? extends Number> list) {
    // 方法体
}

在上面的代码中,我们使用了泛型通配符? extends Number来表示Number类及其子类。

使用固定上边界通配符的好处是可以确保泛型参数的类型满足一定的限制,从而使程序更加类型安全。

但是需要注意的是,使用固定上边界通配符时,不能将任何类型的对象放入泛型容器中,只能放入指定类型及其子类的对象。

 

3. 固定下边界的通配符

Java中的泛型通配符可以使用super关键字指定一个下边界,这种通配符被称为固定下边界通配符。

固定下边界的通配符是指使用”? super T”来表示一个下界为T的通配符,它可以匹配T类型或T的任何父类。

它的语法形式为:

List<? super Integer> list = new ArrayList<>();

使用固定下边界的通配符可以使泛型变量更具体,因为它可以匹配指定类型及其父类型。

例如:如果我们想要一个泛型类型的参数,它必须是Integer类或其父类的实例,我们可以这样定义:

public void someMethod(List<? super Integer> list) {
    // 方法体
}

在上面的代码中,我们使用了泛型通配符? super Integer来表示Integer类及其父类。

以上就是Java泛型通配符详解,更多Java泛型请查看:Java泛型详解,史上最全图文详解!

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法