Java设定类型通配符的上限和设定类型形参的上限
一 点睛
使用List<?>这种形式是,即表明这个List集合可以是任何泛型List的父类。
但还有一种特殊的情形,我们不想这个List<?>是任何泛型List的父类,只想表示它是某一类泛型List的父类。
例如:我们需要一种泛型表示方法,它可以表示所有Shape泛型List的父类,为了满足这种需求,Java泛型提供了被限制的泛型通配符。
被限制的泛型通配符的如下表示:
List<? extends Shape>
二 实战——绘图程序的实现
1 Shape.java
// 定义一个抽象类Shape
public abstract class Shape
{
public abstract void draw(Canvas c);
}
2 Circle.java
// 定义Shape的子类Circle
public class Circle extends Shape {
// 实现画图方法,以打印字符串来模拟画图方法实现
public void draw( Canvas c ) {
System.out.println("在" + c + "画布" + "上画一个圆");
}
}
3 Rectangle.java
// 定义Shape的子类Rectangle
public class Rectangle extends Shape
{
// 实现画图方法,以打印字符串来模拟画图方法实现
public void draw(Canvas c)
{
System.out.println("把一个矩形画在画布" + c + "上");
}
}
4 Canvas.java
import java.util.*;
public class Canvas
{
// // 同时在画布上绘制多个形状
// public void drawAll(List<Shape> shapes)
// {
// for (Shape s : shapes)
// {
// s.draw(this);
// }
// }
// public void drawAll(List<?> shapes)
// {
// for (Object obj : shapes)
// {
// Shape s = (Shape)obj;
// s.draw(this);
// }
// }
// 同时在画布上绘制多个形状,使用被限制的泛型通配符
public void drawAll(List<? extends Shape> shapes)
{
for (Shape s : shapes)
{
s.draw(this);
}
}
@Override
public String toString() {
return "彩色";
}
public static void main( String[] args)
{
List<Circle> circleList = new ArrayList<Circle>();
circleList.add(new Circle());
Canvas c = new Canvas();
c.drawAll(circleList);
}
}
5 运行
在彩色画布上画一个圆
三 设定类型形参的上限
1 点睛
Java泛型不仅允许在使用通配符形参时设定类型上限,也可以在定义类型形参时设定上限,用于表示创给该类型形参的实际类型必须是该上限类型,或是该上限类型的子类。
语法如下格式:
Apple<T extends Number>
2 实战
public class Apple<T extends Number>
{
T col;
public static void main(String[] args)
{
Apple<Integer> ai = new Apple<>();
Apple<Double> ad = new Apple<>();
// 下面代码将引起编译异常,下面代码试图把String类型传给T形参
// 但String不是Number的子类型,所以引发编译错误
//Apple<String> as = new Apple<>(); // ①
}
}
3 说明
定义了一个Apple泛型类,该Apple类的类型形参上限是Number类,这表明使用Apple类型时为T形参传入实际类型参数只能是Number或Number类的子类。
还没有评论,来说两句吧...