泛型可以解决数据类型的安全问题,其主要方法是在类声明时通过一个标识表示类中的某个属性的类型或者方法返回值及参数的类型。
泛型类的定义格式如下:
[访问权限] class 类名称<泛型类型标识1,泛型类型标识2,...,泛型类型标识n> {
[访问权限] 泛型类型标识 变量名;
[访问权限] 泛型类型标识 方法名() {}
[访问权限] 泛型类型标识 方法名(泛型类型标识 变量名) {}
}
泛型对象定义格式如下:
类名称<具体类> 对象名称 = new 类名称<具体类>();
看上面的格式肯定是比较抽象,现在通过一个示例来使用泛型定义类并且声明对象:
//定义的类如下:
package net.jerryblog.generic;
public class Point<T> {
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
}
//使用泛型定义对象并使用
package net.jerryblog.generic;
public class PointDemo {
public static void main(String[] args) {
Point<Integer> pnt = new Point<Integer>();
pnt.setVar(30);
System.out.println(pnt.getVar());
}
}
上面的Point在定义时使用了<T>,T实际上表示此类型是由外部声明本类的对象时指定的。这里使用其他任何字母均可,只不过T是Type的简写,表示类型。这样比较好理解。
上面在new对象时,并没有直接指定成int,而是指定成Integer,这是因为泛型指定是无法指定基本数据类型的,必须指定成一个类。因此涉及基本类型时,就必须指定成其包装类。
如果设置的内容与泛型类型不一致时,编译时就会报错。看看下面的代码:
package net.jerryblog.generic;
public class PointDemo {
public static void main(String[] args) {
Point<Integer> pnt = new Point<Integer>();
pnt.setVar("30");
System.out.println(pnt.getVar());
}
}
上面的代码在使用Point类声明对象时指定类型为Integer,但是实际给Point的成员变量传递值的时候却传递的是String类型,那么在编译期,系统就会报错。而不采用泛型时,编译期间是不会出现错误的,运行期才会抛出ClassCastException异常。
要使用泛型为构造方法指定参数,其实原理也是一样的。
package net.jerryblog.generic;
public class Point<T> {
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
public Point(T var) {
this.var = var;
}
}
package net.jerryblog.generic;
public class PointDemo {
public static void main(String[] args) {
Point<Integer> pnt = new Point<Integer>(30);
System.out.println(pnt.getVar());
}
}
如果一个类中有多个属性分别需要使用不同的泛型声明,则可以在定义类的时候使用多个泛型类型。见示例代码:
package net.jerryblog.generic;
public class MultiTypePoint<K,V> {
private K key;
private V value;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
package net.jerryblog.generic;
public class MultiTypeDemo {
public static void main(String[] args) {
MultiTypePoint<Integer,String> pnt = new MultiTypePoint<Integer, String>();
pnt.setKey(1);
pnt.setValue("1");
System.out.println("key:" + pnt.getKey() + " value:" + pnt.getValue());
}
}
如果在定义类时使用了泛型,但是在实用类new对象时没有指定具体类型,在编译时系统会给出警告。但是在运行时,不会有问题。因为系统自动对所有的类型统一采用Object类型进行接收。这样的情况基本等同于下面的代码:
MultiTypePoint<Object,Object> pnt = new MultiTypePoint<Object, Object>();
参考书
《Java开发实战经典》 李兴华 编著
分享到:
相关推荐
Java泛型学习笔记.pdf
java泛型详细学习,深入学习java的不二之选
泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类<元素类型>, 添加元素...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的...
收集的java李兴华老师的课件笔记。感觉还不错,适合回顾和新手补习。
此word学习文档适合泛型入门的人学习,对泛型的介绍内容详细,其中内容均为本人从网上搜集整理。
《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...
基于Java的源码-java多线程反射泛型及正则表达式学习笔记和源码.zip
java多线程反射泛型及正则表达式学习笔记和源码.zip
本书是作者近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型、J2SE中标准的API等均进行了...
尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 ...
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...
自己整理的JAVA学习笔记,非计算机专业,包括数据基础和泛型编程,集合,多线程,IO流,网络部分未上传,如果觉得对你有帮助就很棒啦!
基于Java的源码-多线程反射泛型及正则表达式学习笔记和源码.zip
详细的描述了java的基本知识,配合看java视频更好了。 笔记中有集合,泛型,线程,的详细案例,还有java.net的资料