您的位置:首页 > 其它

泛型

2016-04-07 11:15 190 查看
泛型简述

可以简单地将泛型理解为参数化类型。

通过使用泛型,可以创建以类型安全的方式使用各种类型数据的类、接口和方法。许多算法虽然操作数据类型不同,但算法逻辑相同。例如,不管堆栈存储的数据类型是Integer、String、Object还是Thread,支持堆栈的机制是相同的。使用泛型,可以 只定义一次算法,使其独立特定的数据类型,然后将算法应用于各种数据类型而不需要做任何额外工作。

泛型机制能告知编译器每个集合中接受哪些对象类型,执行类型检查,自动对插入对象进行类型转换,并在编译时告知是否插入了类型错误的对象,这样程序既安全又清晰。

在没有泛型前,创建一般化的类、接口和方法可以通过操作Object类型的引用来操作各种类型的对象,因为Object是所有其他类的超类,所以Object引用变量可以引用所有类型的对象。但是它们没办法以类型安全的方式进行工作,当从集合中读取到每一个对象时都要进行类型转换。

泛型提供了类型安全性,简化了处理过程。使用泛型,所有类型都是自动和隐式进行的,无需在Object和实践操作的数据类型之间进行转换。泛型扩展了重用代码的能力,并且可以安全、容易地 重用代码。

泛型类和接口

声明中具有一个或者多个类型参数的类或者接口。类型参数(类型变量)由尖括号界定,放在类或接口后面,interface List< T>、class TestGen< K,V>,这里的T、K、V不是值,而是类型。如List< String>是一个参数化的类型,表示元素类型为String的列表。(String是与形式类型参数E相对应的实际类型参数。)

每个泛型都定义一个原生态类型(raw type),即不带任何类型参数的泛型名称。如与List< E>相对应的原生态类型是List。原生态类型List与Java平台没有泛型之前的接口类型List完全一样,使用时是用实际类型参数替换掉形式类型参数E。



对于泛型类(含集合类):

1.对象实例化时不指定泛型,默认为:Object。

2.泛型不同的引用不能相互赋值。

3.加入集合中的对象类型必须与指定的泛型类型一致。

4.静态方法中不能使用类的泛型。

5.如果泛型类是一个接口或抽象类,则不可创建泛型

类的对象。

6.不能在catch中使用泛型

7.从泛型类派生子类,泛型类型需具体化

把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想。



泛型方法





泛型和继承的关系





通配符





代码示例

public static void main(String[] args) {
List<?> list = null;
list = new ArrayList<String>();
list = new ArrayList<Double>();
//list.add(3);
list.add(null);

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
l1.add(“阿法园");
l2.add(15);
read(l1);
read(l2);
}
static void read(List<?> list){
for(Object o : list){
System.out.println(o);
}
}


有限制通配符



public static void printCollection3(Collection<? extends Person> coll){
//Iterator只能用Iterator<?>或Iterator<? extends Person>.why?
Iterator<?> iterator  = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
public static void printCollection4(Collection<? super Person> coll){
Iterator<?> iterator  = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: