版权声明:转载注明来源。Keep Learning and Coding. https://blog.csdn.net/a771581211/article/details/88384417
首先依旧是定义Point测试类:
package day04;
/**
* 泛型
* 泛型又称为参数化类型,是将当前类的属性的类型、方法参数的类型
* 以及方法返回值的类型的定义权移交给使用者。使用者在创建当前类
* 的同时将泛型的实际类型传入。
* @author kaixu
*
* @param <T>
*
*/
public class Point<T> {
private T x;
private T y;
public Point(T x,T y){
super();
this.x = x;
this.y = y;
}
public T getX(){
return x;
}
public void setX(T x){
this.x = x;
}
public T getY(){
return y;
}
public void setY(T y){
this.x = y;
}
public String toString(){
return "("+x+","+y+")";
}
}
之后定义TestPoint类对泛型的功能进行检测:
package day04;
public class TestPoint {
public static void main(String[] args) {
Point<Integer>p1 = new Point<Integer>(1,2);
p1.setX(2);
int x1= p1.getX();
System.out.println("x1:"+x1);
Point<Double>p2 = new Point<Double>(1.1,2.2);
p2.setX(2.2);
double x2 = p2.getX();
System.out.println("x2:"+x2);
Point<String> p3 = new Point<String>("一","二");
p3.setX("二");
String x3 = p3.getX();
System.out.println("x3:"+x3);
}
}
在此基础为了完全证明泛型的原型是Object,再定义TestPoint2类重写相关方法,加深对泛型的理解。
package day04;
/**
* 泛型的原型是Object,定义了泛型知识编译器在做一些验证工作。
* 当我们对泛型类型设置值时,会检查是否满足类型要求。
* 当我们获取一个泛型类型的值时,会自动进行类型转换。
* @author kaixu
*
*/
public class TestPoint2 {
public static void main(String[] args) {
/*
* 这里指定泛型的实际类型为Integer
* 但实际上,创建的Point对象中,x,y属性是Object类型
* 这里只是应当将它当作Integer看待。
*/
Point<Integer> p1 = new Point<Integer>(1,2);
/*
* 由于参数是T,这里会验证实参是否为Integer
* 若不是则会编译失败。
* 可以传入基本类型,因为还会自动装箱。
*/
p1.setX(1);
/*
*获取时,也会进行自动造型。这里无需显示的进行了类型转换。
*/
int x1 = p1.getX();
Point p2 = p1;
p2.setX("一");
String x2 = (String)p2.getX();
System.out.println("x2:"+x2);
//类造型异常!
x1 = p1.getX();
System.out.println("x1:"+x1); //String类型无法造型为Integer类型
}
}
以上。