假设需要定义一个方法,该方法里有一个集合形参,集合形参的元素类型是不确定的,那应该怎么定义呢?
在下面代码中:
本文包含:
- 使用类型通配符
- 设定类型通配符的上限
- 设定类型形参的上限
1. 使用类型通配符
为了表示各种泛型 List 的父类,可以使用类型通配符(?),将问号作为类型实参传给 List 集合,写作:List<?>(意思是元素类型未知的 List),此问号的元素类型可以匹配任何类型。
但这种通配符仅表示它是各种泛型 List 的父类,并不能把元素加入到其中。
如下代码会编译错误:
2. 设定类型通配符的上限
考虑特殊情形:程序不希望List<?>是任何泛型 List 的父类,只希望它代表某一类泛型 List 的父类。考虑一个简单的绘图程序,下面先定义三个形状类:
上面定义了三个形状类,其中shape 是一个抽象父类,该抽象父类有两个子类:Circle 和 Rectangle。接下来定义一个 Canvas 类,该画布类可以画数量不等的形状(Shape 子类的对象),那应该如何定义这个 Canvas 类呢?
考虑如下 Canvas 实现类。
注意上面的 drawAll () 方法的形参类型是 List,而 List
关键在于 List
上面程序使用了通配符来表示所有的类型。
3. 设定类型形参的上限
Java 泛型不仅允许在使用通配符形参时设定上限,而且可以在定义类型形参时设定上限,用于表示传给该类型形参的实际类型要么是该上限类型,要么是该上限类型的子类。下面程序示范了这种用法:
在一种更极端的情况下,程序需要为类型形参设定多个上限(至多有一个父类上限,可以有多个接口上限),表明该类型形参必须是其父类的子类(是父类本身也行),并且实现多个上限接口。如下代码所示:
与类同时继承父类、实现接口类似的是,为类型形参指定多个上限时,所有的接口上限必须位于类上限之后。也就是说,如果需要为类型形参指定类上限,类上限必须位于第一位。