泛型


泛型简述

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

通过使用泛型,可以创建以类型安全的方式使用各种类型数据的类、接口和方法。许多算法虽然操作数据类型不同,但算法逻辑相同。例如,不管堆栈存储的数据类型是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());
    }  
}


这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值