假设需要定义一个方法,该方法里有一个集合形参,集合形参的元素类型是不确定的,那应该怎么定义呢?
在下面代码中:
Java 类型通配符Java 类型通配符Java 类型通配符
Java 类型通配符Java 类型通配符
本文包含:

  1. 使用类型通配符
  2. 设定类型通配符的上限
  3. 设定类型形参的上限

1. 使用类型通配符

为了表示各种泛型 List 的父类,可以使用类型通配符(?),将问号作为类型实参传给 List 集合,写作:List<?>(意思是元素类型未知的 List),此问号的元素类型可以匹配任何类型。
Java 类型通配符
但这种通配符仅表示它是各种泛型 List 的父类,并不能把元素加入到其中。
如下代码会编译错误:
Java 类型通配符

2. 设定类型通配符的上限

考虑特殊情形:程序不希望List<?>是任何泛型 List 的父类,只希望它代表某一类泛型 List 的父类。考虑一个简单的绘图程序,下面先定义三个形状类:
Java 类型通配符
Java 类型通配符
上面定义了三个形状类,其中shape 是一个抽象父类,该抽象父类有两个子类:Circle 和 Rectangle。接下来定义一个 Canvas 类,该画布类可以画数量不等的形状(Shape 子类的对象),那应该如何定义这个 Canvas 类呢?
考虑如下 Canvas 实现类。
Java 类型通配符
注意上面的 drawAll () 方法的形参类型是 List,而 List 并不是 List的子类型,因此,下面代码将引起编译错误。
Java 类型通配符
关键在于 List 并不是 List 的子类型,所以不能把 List 对象当成 List 使用。为了表示List 的父类,可以考虑使用 List<?> ,把Canvas 改成如下形式:
Java 类型通配符
上面程序使用了通配符来表示所有的类型。
Java 类型通配符Java 类型通配符

3. 设定类型形参的上限

Java 泛型不仅允许在使用通配符形参时设定上限,而且可以在定义类型形参时设定上限,用于表示传给该类型形参的实际类型要么是该上限类型,要么是该上限类型的子类。下面程序示范了这种用法:
Java 类型通配符
Java 类型通配符
在一种更极端的情况下,程序需要为类型形参设定多个上限(至多有一个父类上限,可以有多个接口上限),表明该类型形参必须是其父类的子类(是父类本身也行),并且实现多个上限接口。如下代码所示:
Java 类型通配符
与类同时继承父类、实现接口类似的是,为类型形参指定多个上限时,所有的接口上限必须位于类上限之后。也就是说,如果需要为类型形参指定类上限,类上限必须位于第一位。

相关文章:

  • 2022-12-23
  • 2021-05-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-14
  • 2021-10-09
  • 2022-01-10
猜你喜欢
  • 2021-11-07
  • 2022-12-23
  • 2021-12-31
  • 2021-12-26
  • 2021-08-11
  • 2021-07-29
  • 2022-12-23
相关资源
相似解决方案