Java泛型(generics)
泛型引入
看一个问题,当我们一个方法的返回值有不同数据类型需要返回的时候,我们该怎么办。
下面是一个例子。
package xiana; class GenericObject { private Object x; //可以用object来接受所有的类型。 private Object y; public Object getX() { return x; } public void setX(Object x) { this.x = x; } public Object getY() { return y; } public void setY(Object y) { this.y = y; } } public class Generic { public static void main(String[] args) { GenericObject g = new GenericObject(); g.setX(10); g.setY(20); int gx = (Integer)g.getX(); //自动拆箱转换int类型 int gy = (Integer)g.getY(); System.out.println("x="+gx+" y="+gy); //这里可以正常执行 打印结果 x=10 y=20 g.setX(10.1f); g.setY(20.2f); float gxf = (Float)g.getX(); //自动拆箱转换int类型 float gyf = (Float)g.getY(); System.out.println("x="+gxf+" y="+gyf);//这里可以正常执行 打印结果 x=10.1 y=20.2 } }
上面的代码可以正常执行并打印出正常的结果。但是代码修改如下,程序编译可以通过但是在程序执行的时候就报错了。
该错误提示类型转换问题报错。针对该问题,如果想要上面的程序可以正常执行,这时候就可以使用泛型。
泛型介绍
泛型(generics)是JDK 5 中引入的一个新特性, 泛型可以解决数据类型的安全性问题,就是早编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型的原理是在类申明的时候通过一个标示表示类中的某个属性的类型或者某个方法的返回值及参数类型。
泛型的格式:
访问权限 class 类名 <泛型,泛型....> {
属性
方法
}
对象的创建:
类名 <具体对象> 对象名称 = new 类名称<具体类型>();
好了现在已经知道泛型的基本使用了,那么上面的代码可以用泛型来修改下。
package xiana; class GenericObject<T> { private T x; private T 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.y = y; } } public class Generic { public static void main(String[] args) { GenericObject<String> g = new GenericObject(); g.setX("设置x值"); g.setY("设置y值"); System.out.println("x="+g.getX()+" y="+g.getY()); // 打印出结果 x=设置x值 y=设置y值 } }
上面<T>是表示泛型的默认值,可以被任意类型所代替,下面Generic类调用GenericObject就是设置了String类型,如果将下面g.setY括号里的值设置为int类型,那么编译时候就会提示错误 The method setY(String) in the type GenericObject<String> is not applicable for the arguments (int)。