Java设定类型通配符的上限和设定类型形参的上限

左手的ㄟ右手 2021-09-29 03:40 443阅读 0赞

一 点睛

使用List<?>这种形式是,即表明这个List集合可以是任何泛型List的父类。

但还有一种特殊的情形,我们不想这个List<?>是任何泛型List的父类,只想表示它是某一类泛型List的父类。

例如:我们需要一种泛型表示方法,它可以表示所有Shape泛型List的父类,为了满足这种需求,Java泛型提供了被限制的泛型通配符。

被限制的泛型通配符的如下表示:

List<? extends Shape>

二 实战——绘图程序的实现

1 Shape.java

  1. // 定义一个抽象类Shape
  2. public abstract class Shape
  3. {
  4. public abstract void draw(Canvas c);
  5. }

2 Circle.java

  1. // 定义Shape的子类Circle
  2. public class Circle extends Shape {
  3. // 实现画图方法,以打印字符串来模拟画图方法实现
  4. public void draw( Canvas c ) {
  5. System.out.println("在" + c + "画布" + "上画一个圆");
  6. }
  7. }

3 Rectangle.java

  1. // 定义Shape的子类Rectangle
  2. public class Rectangle extends Shape
  3. {
  4. // 实现画图方法,以打印字符串来模拟画图方法实现
  5. public void draw(Canvas c)
  6. {
  7. System.out.println("把一个矩形画在画布" + c + "上");
  8. }
  9. }

4 Canvas.java

  1. import java.util.*;
  2. public class Canvas
  3. {
  4. // // 同时在画布上绘制多个形状
  5. // public void drawAll(List<Shape> shapes)
  6. // {
  7. // for (Shape s : shapes)
  8. // {
  9. // s.draw(this);
  10. // }
  11. // }
  12. // public void drawAll(List<?> shapes)
  13. // {
  14. // for (Object obj : shapes)
  15. // {
  16. // Shape s = (Shape)obj;
  17. // s.draw(this);
  18. // }
  19. // }
  20. // 同时在画布上绘制多个形状,使用被限制的泛型通配符
  21. public void drawAll(List<? extends Shape> shapes)
  22. {
  23. for (Shape s : shapes)
  24. {
  25. s.draw(this);
  26. }
  27. }
  28. @Override
  29. public String toString() {
  30. return "彩色";
  31. }
  32. public static void main( String[] args)
  33. {
  34. List<Circle> circleList = new ArrayList<Circle>();
  35. circleList.add(new Circle());
  36. Canvas c = new Canvas();
  37. c.drawAll(circleList);
  38. }
  39. }

5 运行

在彩色画布上画一个圆

三 设定类型形参的上限

1 点睛

Java泛型不仅允许在使用通配符形参时设定类型上限,也可以在定义类型形参时设定上限,用于表示创给该类型形参的实际类型必须是该上限类型,或是该上限类型的子类。

语法如下格式:

  1. Apple<T extends Number>

2 实战

  1. public class Apple<T extends Number>
  2. {
  3. T col;
  4. public static void main(String[] args)
  5. {
  6. Apple<Integer> ai = new Apple<>();
  7. Apple<Double> ad = new Apple<>();
  8. // 下面代码将引起编译异常,下面代码试图把String类型传给T形参
  9. // 但String不是Number的子类型,所以引发编译错误
  10. //Apple<String> as = new Apple<>(); // ①
  11. }
  12. }

3 说明

定义了一个Apple泛型类,该Apple类的类型形参上限是Number类,这表明使用Apple类型时为T形参传入实际类型参数只能是Number或Number类的子类。

发表评论

表情:
评论列表 (有 0 条评论,443人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法下限上限理论

    下限和上限理论是一个数学概念,涉及在给定某些约束或条件的情况下找到某个量的最小和最大可能值。它经常用于优化问题,其目标是找到受某些约束的函数的最大值或最小值。 用数学术语来说