您的位置:首页 > 编程语言 > Java开发

JAVA泛型详解

2015-06-10 17:32 507 查看
JAVA泛型详解
转自:http://blog.csdn.net/junjle
1. 初级
Java中经常遇到<T>这种菱形里面有一个标识符,这就是JDK1.5引入的泛型。
泛型概述
ListmList = new
ArrayList();
mList.add("测试1");
mList.add("测试2");
mList.add("测试3");
mList.add(1);
for(inti=0;i<mList.size();i++){
String str = (String)mList.get(i);
}
上面一段代码定义了一个list用来存储数据,由于list的add参数为object类型,只要是object子类都可以使用add方法进行添加,这就导致了一个问题例如我们想存储String类型数据,误把整形数据存储进去,编译时不会报错,运行就会报java.lang.ClassCastException,一个健壮的程序是会在编译时把错误报出来的。当然继承List重写add方法可以解决这个问题,JDK1.5引用了泛型来解决此类问题

1. 集合中的泛型
List<String>mList = new ArrayList<String>();
定义及初始化集合时在类型后面加上<Type>,则表示该集合变量仅能存储对应类型的变量,否则会在程序编译期间报错,降低程序的风险
2. 中级
1.定义泛型类、接口

原理同集合中的泛型,生命类和接口是也可以使用泛型
public
class
test<T> {
T strT;
public
void
setT(T t){
this.strT= t;
}
public T getT(){
return
this
.strT;
}
public
static void
main(String[] args) {
test<String>gen = newtest<String>();
gen.setT("测试");
Stringstr = gen.getT();
System.out.println(str);
test<Integer>genIntegerTest = newtest<>();
genIntegerTest.setT(1);
Integerinteger = genIntegerTest.getT();
System.out.println(integer);
}
}
如上代码,生命类时在类名称后面使用泛型<T>,T可当作实际类型使用,创建对象时动态引入实际变量,大大增加代码复用性与可靠性。接口与类相同
注意:
1.声明时必须指定泛型的实际类型:
test<String> gen = new test<String>();
JDK7之后可以省略定义处的泛型,如下也是正确的"
test<String> gen = new test<>();
2. 定义泛型的类或接口在被继承或被实现是一定要致命泛型的实际类型,例:

正确写法:Classextends Test<String>

错误写法:Classextends Test<T>

3. 不可以把泛型类定义的对象赋值给普通类对象,容易引起错误

2.定义泛型方法

1. 方法中也可以引入泛型
定义:
public<T>add(T t){
this.add(t);
}
使用:
Stringsrt;
Obj.add(str);
使用时直接传入实参即可,会自动判断类型
注意:方法中定义的泛型只在该方法范围内有效,类和接口中定义的泛型在整个类和接口中有效
注意:
1. 方法重载时使用泛型可能会导致运行时错误
2. 高级
1.定义子类泛型类型
<T extends E>表示T类型是E类型的子类型,实际调用时可传入任意类型,但必须保证T是E的子类型即可
2.定义父类泛型类型
<T super E>T是E的父类型,具体同上
3.通配符泛型类型
<?>可以表示任意的类型,<?extends list>表示任意list的子类
注意:
1. java泛型的设计原则就是编译是不报unchecked,则运行时不会报ClassCastException
2. 注意泛型集合与数组的区别
以上是对JAVA泛型总结,下面说一下泛型的应用:
泛型主要应用在集合上,用来限定集合存储类型
其次将泛型用在类和接口中可以增强代码的复用性,具体可以自己体会
泛型是java与其他语言的一个不同之处,想深入了解的话可以看一下源代码了解java泛型的机制及原理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: