Java基础之泛型程序设计

泛型程序设计
简要介绍

    类型变量使用大写形式,且比较短,在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值得类型。Object 表示”任意类型”
    程序清单使用了Pair类,静态的minmax方法遍历了数组并同时计算出最大值和最小值。它用一个Pair对象返回了两个结果。
    compareTo 方法只有 Comparable 接口有该方法,所以我们要将T限制为实现了Comparable接口的
    的类

类型擦除

无论何时定义一个泛型类型,都自动提供了一个相应的原始类型,原始类型的名字就是删去参数后的泛型类型名,擦除类型变量,并替换为限定类型(无限定的变量用Object)
例如:Pair 的原始类型如下所示:

public class Pair <Object>{
    private Object name;
    private Object bonus;

    public Object getFirst() {
        return name;
    }

    public void setFirst(Object name) {
        this.name = name;
    }

    public Object getSecond() {
        return bonus;
    }

    public void setSecond(Object bonus) {
        this.bonus = bonus;
    }

    public Pair(){}
    public Pair(Object name, Object bonus) {
        this.name = name;
        this.bonus = bonus;
    }

    @Override
    public String toString() {
        return "Pair{" +
                "name=" + name +
                ", bonus=" + bonus +
                '}';
    }


类型擦除带来的方法参数不统一,编译器通过桥方法来处理。
与Java泛型转换的事实

    虚拟机中没有泛型,只有普通的类和方法。
    所有的类型参数都用它们的限定类型替换
    桥方法被合成来保持多态
    为保持类型安全性,必要时插入强制类型转换。

约束与局限性

    不能用基本类型实例化类型参数

例如没有 Pair<double>,只有 Pair<Double>

    运行时类型查询只适用于原始类型
    例如:

Pair<String> stringPair=new Pair<String>();
Pair<Employee> employeePair=new Pair<Employee>();
if(stringPair.getClass()==employeePair.getClass())

 
其比较结果是true,这是因为两次调用getClass都将返回 Pair.class

    不能创建参数化类型的数组
    例如:
    Pair<String>[] table=new Pair<String>[10] //error

    Varargs 警告

public static <T> void addAll(Collection<T> coll,T ... ts){
    for(t: ts) coll.add(t);
}


现考虑以下调用:


Collection<Pair<String>> table=...;
Pair<String> pair1=...;
Pair<String> pair2=...;
Pair<String> pair3=...;
addAll(table,pair1,pair2);


为了调用这个方法,Java虚拟机必须建立一个Pair 数组。这就违反了前面的规则。
不过,对于这种情况,规则有所放松,你只会得到一个警告,而不是错误。

可以采取两种方法来抑制这个警告。一种方法是为包含addAll调用的方法增加注解@SuppressWarnings(“unchecked”)。或者在Java SE 7中,还
可以用@SafeVarargs直接标注addAll方法。

5 不能实例化类型变量
不能使用像new T(…),new T[…] 或T.class 这样的表达式中的类型变量,例如下面
Pair 构造器就是非法的:
public Pair(){name=new T();bonus=new T();}
类型擦除将T改变成了Object,而且,其本意肯定不希望调用new Object()。在Java SE 8之后,最好的解决办法是让调用者
提供一个构造器表达式。例如:
Pair<String> p=Pair.makePair(String::new)

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:Java基础之泛型程序设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值