Java泛型简介

来源:互联网 发布:linux打开摄像头命令 编辑:程序博客网 时间:2024/05/17 01:09

引言
泛型(generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符(就像方法的形式参数是运行时传递的值的占位符一样)。

例:Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况,在给定映射(map)中保存某个特定类型(比如String)的对象。因 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:

Map m = new Hashmap(); m.put("key","hello"); m.put("value",100.00); String s = (String) m.get("key"); float n = (float)m.get("value");

使用泛型表达:

Map<String,Float> m = new Hashmap<String,Float>(); m.put("key","hello"); String s = m.get("key"); float n = m.get("value");

上述实例,我们通俗理解为,泛型类似于能实现任何类型对象适配的能力。

分析

泛型,有何作用?

1. 由于泛型的类型约束,类型检查从运行时挪到编译时,类型错误导致的ClassCastException,议程将提前发现问题并解决问题。
2. 泛型使数据有更直接的表达,而非强制类型转换所得。消除源代码中的许多强制类型转换,这使得代码更加可读,并且减少了出错机会。

实现
我们通过两个实例来进行对比说明,体会泛型的实现原理及意义。

class Point {         private Object x;         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 PointTest {         public static void main(String[] args) {                 Point point = new Point();                 point.setX(123);                        // 整数接收                 point.setY("北纬60");        // 这里是用Object来接收的,所以可以接收任何类型                 int x = (Integer) point.getX();                 int y = (Integer) point.getY();                 System.out.println("x坐标:" + x);                 System.out.println("y坐标:" + y);         } } 结果: Exception in thread "main" java.lang.ClassCastException : java.lang.String cannot be cast to java.lang.Integer at test.PointTest.main( PointTest.java:42 )

泛型实例:

class Point1<T> {                // 声明一个泛型类         private T var;                 // 声明一个泛型变量         private T Yar;         public T getVar() {                 return var;         }         public void setVar(T var) {                 this.var = var;         }         public T getYar() {                 return Yar;         }         public void setYar(T yar) {                 Yar = yar;         } } public class PointTest1 {         public static void main(String[] args) {                 Point1<Object> point = new Point1<Object>();                 point.setVar(20);                 point.setYar("北纬");                 System.out.println("x坐标:" + point.getVar());                 System.out.println("y坐标:" + point.getYar());         } } 结果: x坐标:20 y坐标:北纬

总结
通过对泛型的初步了解,我对泛型的理解是,它拥有实现任何类型对象适配的能力。使集合中的数据有更直接的表达,而非强制类型转换所得期望类型。

实例只是对泛型的一个初步的了解,需要了解更多的知识体系请自行查询资料。

0 0
原创粉丝点击