Java泛型

为什么使用泛型?用Object不行吗?
答案是可以的!也就是说泛型可以实现的功能,用Object也是可以实现的。 因为泛型有如下优点:
1、无须类型强转,提高效率,避免了强转出错。
2、通配符"?"的使用提高了程序的阅读性。
3、限制通配符(<? extends T>、<? super T>)提高了程序的健壮性。
Java泛型约束点:
1、 不能使用基本数据类型实例化类型参数, 不能使用类型参数代替基本数据。因此,没有Pair<double>,只有Pair<Double>(这里我们假设Pair是一个public class Pair<T> 类型的一个类)。这个非常的好理解,想一想我们在使用List集合时,不能这样子来定义一个集合:List<int> list = new ArrayList<>(),通常都是这样来定义一个int类型的集合:List<Integer> list = new ArrayList<>();
       在我们定义一个泛型类的时候,都会自动的给我们提供一个相应的原始类型(这个原始类型不是像Integer对应的是原始数据类型是int)。这里的原始数据类型就是删除类型参数之后的泛型类型名、擦除类型变量,并且替换为限定类型(如果没有限定类型,那么就用Object来代替)。
       如果泛型类型被限制了的,也就是T extends其他的类或者接口,就取extends关键字之后第一个类型来作为擦除之后的类型。为什么这里要强调是extends关键字之后第一个类型呢?因为extends关键字之后可以跟多个类或者接口,多个类或者接口使用&来连接。
      Pair类含有Object类型的成员变量,但是Object不能存储double类型的值。
2、 运行时类型查询只适用于原始类型
我们知道可以使用instanceof关键字来判断一个引用是否是一个类的对象。在泛型里面,这种代码是不支持的:
if(a instanceof Pair<String>)
Pair<String> p = (Pair<String>)a;
Pair<String> stringPair = new Pair<>();
Pair<Integer> integerPair = new Pair<>();
if(stringPair.getClass() == integerPair.getClass()){ //true
   
}
3、 不能创建泛型类型的数组
Pair < String > pairs [ ] = new Pairs < String > [ 10 ] ;
只是不允许创建泛型类型的数组,而生命类型为Pair<String>[]的变量仍是合法的,只是不允许使用new Pair<String>[10]这种方式来初始化变量。
可以声明通配类型的数组,然后进行强制类型转换:Pair<String> pairs = (Pair<String>[]) new Pair<?>[10]
4、 不能创建泛型类型的变量
不能使用像new T(...)、new T[...]或者T.class这样的表达式。
5、 不能构造泛型数组
就像不能创建一个泛型类型的对象,也不能创建泛型类型的数组。不过原因有所不同,毕竟数组会填充null值,构造是看上去是安全的。不过,数组本身也有类型,用来监控在虚拟机中的数组,这个类型会被擦除。
6、不能构造泛型数组
就像不能创建一个泛型类型的对象,也不能创建泛型类型的数组。不过原因有所不同,毕竟数组会填充null值,构造是看上去是安全的。不过,数组本身也有类型,用来监控在虚拟机中的数组,这个类型会被擦除。
public static < T extends Comparable > T [ ] minAndMax ( T a [ ] ) {
    T ts [ ] = new T [ 2 ] ;
    . . . . . .
    return ts ;
}
7、泛型类的静态上下文在泛型类型中无效
静态变量不能定义泛型类型,静态方法的返回类型不能定义为泛型类型。 例如,下面的写法是错误的:
public class Interval<T>{
    private static T singleInstance; //错误,静态变量的类型不能为泛型类型
    public static T getSingleInstance(){ //错误,静态方法的返回类型为泛型类型。
        return singleInstance;
    }
}
8、 不能抛出或者捕获泛型类的异常
在Java中,不能对泛型类的异常对象进行抛出捕获。实际上,泛型类继承于Throwable类都是不合法的。
public static <T extends Throwable> void doWork(Class<T> clazz){
    try{
       
    }catch(T e){ //错误,不能抛出泛型类型的异常对象
       
    }
}
9、Extends和super是java泛型中的“通配符”和“边界”的概念;
extends是上通配符,super是下通配符;
如果容器之间没有继承关系,直接使用泛型会报错;
Plate<? Super Fruit> 下届通配符表达的概念是一个能放水果以及一切水果基类的盘子;
<? super T>不影响往里存,但往外取只放在Object对象里;
频繁往外读取内容的,适合用上届extend;
经常往里面插入的,适合用下届super;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值