Java 提高(5)----- 泛型

泛型


为什么使用泛型

在没有泛型的情况下,我们可能为一种数据类型写一个方法或者类,这大大增加代码量,当然我们也可以使用Object对象代替某种数据类型,但是这样get会需要强制类型转换,遇到错误只有在运行时才可以发现,在这种情况下我们需要使用泛型类


定义一个简单的泛型

public class Fruit<T> {
    private T data;
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

泛型类型变量使用大写形式,比较短大多是一个字母。在java库中,E代表集合的元素类型;K和V代表表的关键字和值的类型;T,U,S代表任意类型


定义泛型方法

public class DemoOne {
    //<T extends Comparable>确保泛型T实现了Comparable接口,在方法里使用了compareTo()方法
    public static <T extends Comparable> T getMin(T[] datas){
        if( datas == null || datas.length ==0 ){
            return null;
        }
        T smallest = datas[0];
        for(int i = 1 ; i < datas.length ;i++){
            if(smallest.compareTo(datas[i]) > 0){
                smallest = datas[i];
            }
        }
        return smallest;
    }
    public static void main(String[] args) {
        String[] strs = {"bne","awo","three"};
        System.out.println(getMin(strs));
    }
}

在getMin()方法中,我们要确保T所属的类有compareTo方法,所以对变量类型T设置了限定T extends Comparable,在使用时,如果类没有实现Comparable接口就会出现编译错误

T extends BoundingType表示T应该是绑定类型的子类型,T和绑定类型可以是类,也可以是接口


泛型代码与虚拟机

推荐博客: http://www.cnblogs.com/ggjucheng/p/3352519.html

无论什么时候定义一个泛型,都自动提供一个相应的原始类型,原始类型就是删除类型参数后的泛型类型名。转为为原始类型的规则擦除类型变量,替换为限定类型(T extends BoundingType & BoundingType2 中BoundingType就是限定类型,选取第一个限定类型)没有限定类型的用Object

#没有类型限制的泛型原始类型转换
public class Fruit<T> {
    private T data;
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
#原始类型是
public class Fruit {
    private Object data; //没有类型限定的用object
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}
#有多个类型限制的
public class Leo<T extends Comparable & Serializable> implements Serializable {
    private T data;
    public Leo(T data) {
        this.data = data;
    }
}
#原始类型
public class Leo implements Serializable {
    private Comparable data; //用第一个类型限定符表示
    public Leo(Comparable data) {
        this.data = data;
    }
}

主要,在多个类型限制符情况下,把空接口(标签接口)放在后面

总结:

  • 虚拟机中没有泛型,只有普通的方法和类
  • 所以的类型参数都用他们的限制类型替换或者Object
  • 桥方法被合成来保持多天
  • 为保证类型安全性,必要时插入强制类型转换

泛型的约束和局限性

  1. 不能用基本类型实例化类型参数,因为类型擦除后结果为Object,Object不能存储基本数据类型
  2. 运行时查询类型只适用于与原始类型
  3. 不能创建参数化类型的数组
  4. 泛型类的静态上下文中类型变量无效
  5. 不能抛出或捕获泛型类的实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值