泛型主要是解决ClassCastException问题,对象向下转型时存在安全隐患,通过泛型可一定程度解决这个问题。
eg:
定义一个a,b。允许保存三类数据
- 整型数据:a=1, b=2
- 浮点型数据:a=1.1,b=2.1
- 字符串型数据:a=苹果,b=香蕉
于是设计一个Value类的时候,需要考虑以上三种a,b的数据类型
- 整型数据:基本数据类型 -> 包装为Integer类对象 -> 自动向上转型为Object
- 浮点型数据:基本数据类型 -> 包装为Double类对象 -> 自动向上转型为Object
- 字符串类型数据:String类对象 -> 自动向上转型为Object
泛型的本质:类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。那么此时就需要类定义的时候明确定义占位符。
class Value<T>{
private T a;
private T b;
public void setA(T a){
this.a = a;
}
public T getA(){
return this.a;
}
public void setB(T b){
this.b = b;
}
public T getB(){
return this.b;
}
}
public class ValueDemo {
public static void main(String[] args) {
Value<Integer> v = new Value();
v.setA(1);
v.setB(2);
int a = v.getA();
int b = v.getB();
System.out.println(a);
System.out.println(b);
Value<Double> v1 = new Value();
v1.setA(1.0);
v1.setB(2.0);
Double a1 = v1.getA();
Double b1 = v1.getA();
System.out.println(a1);
System.out.println(b1);
}
}
运行结果:
1
2
1.0
1.0
Process finished with exit code 0
如果泛型数据类型设置的时候发现错误,会在编译的时候有提示,而且可以避免向下转型的隐患。泛型不能使用基本数据类型,只能用包装类代替。从1.7开始,可以省略掉后面泛型,直接使用 Value v = new Value();