主题
- 本节主要讲解泛型方法
泛型方法
- 泛型是反面向对象的一种性质(anti-oop)
- 本质上是abstract(请允许我这里用了一个"抽取"的概念)多种类型间的通用操作,这是一个自底向上抽取的过程
- 这种通用操作的概念比接口更广泛,开句玩笑,接口可以是跨越性别谈恋爱,而泛型更广泛到跨越种族
- 关键点:
1)接口的特性是定义公共行为,即多个实现类实现相同接口方法
2)泛型同样需要所有将要作为类型参数的类具有某个些共同方法,泛型它才能"提纲挈领"式的"抽取"公共方法
3)这种公共方法(泛型中"抽取"的)若在没有使用到泛型之 extentds 关键字的时候,大部分是以 Object 中定义的方法来体现当,使用了 extends AA 关键字后,则体现在AA 定义的公共方法上
4)泛型对开发者最有价值的还是体现在 extends 关键字的使用时,此刻可以让用户来定义一个公共边界 - 定义泛型方法
/**
* Created by Dangdang on 2018/4/10.
*/
public class GenericMethod {
//需求1:给所有类的 toString 结果前后添加 @ 符号,即 @test@
public static String show(T t) {
//t.toString() 方法是所有类型都具有的公共方法, Object 中定义
//这里我们在泛型方法中借其定义更加公共的通用方法
String result = "@" + t.toString() + "@";
System.out.println(result);
return result;
}
//需求2:计算实现IArea 接口的图形的面积, 用 extends 指定类型上限
public static Double getArea(T t) {
//公共方法来源于 上限类中,此处是IArea 接口定义的方法
//若不指定 extends getArea() 方法是找不到的
//用组合方法也可以实现该需求,引入一个IArea 接口
return t.getArea();
}
}
针对 需求2 需定义如下代码
//定义公共接口,此刻更体现在边界的概念上,供 extends 使用
public interface IArea {
Double getArea();
}
定义实现类
/**
* Created by Dangdang on 2018/4/10.
* 定义实现公共接口的具体类
*/
public class Circle implements IArea {
private Integer radius;
public Circle(Integer radius) {
this.radius = radius;
}
//实现公共方法
@Override
public Double getArea() {
double area = Math.PI * radius * radius;
System.out.println(area);
return area;
}
getter
setter
}
public class Rectangle implements IArea {
private Double width;
private Double height;
public Rectangle(Double width, Double height) {
this.width = width;
this.height = height;
}
@Override
public Double getArea() {
double area = width * height;
System.out.println(area);
return area;
}
getter
setter
}
定义test
public class GenericMethodDemo {
public static void main(String[] args) {
//泛型方法测试,无 extends
String a = "lisi";
Integer b = 4;
Date date = new Date();
GenericMethod.show(a);
GenericMethod.show(b);
GenericMethod.show(date);
System.out.println("...............");
//泛型方法测试,无 extends
Circle circle = new Circle(3);
Rectangle rectangle = new Rectangle(new Double(2.0), new Double(3.0));
//泛型方法,传入任意实现 IArea 接口的类
GenericMethod.getArea(circle);
GenericMethod.getArea(rectangle);
}
}