泛型约束与局限性(上)

泛型约束与局限性(上)
  1. 由于类型擦除,所以不能使用基本类型实例化类型参数,Object不能存储基本类型的值(基本类型的包装类可以)。

  2. 不能使用instanceof比较两个泛型变量的类型参数是否相等,只能比较它们是否为同一泛型。

    ArrayList<Number> arrayList = new ArrayList<>();
    // 报错泛型类型不合法
    System.out.println(arrayList instanceof ArrayList<Number>);
    
    // 这样是合理的
    System.out.println(arrayList instanceof ArrayList);
    // true
    
  3. 不能创建参数化类型的数组。

    ArrayList<Number>[] arrays = new ArrayList<Number>[10];
    
    // 在类型擦除后
    ArrayList<Number>[] arrays // 相当于
    	ArrayList[] arrays
    // 此时如果这样做也是可以的
        ArrayList[] arrays = new ArrayList<String>[10];
    // 可以通过数组存储检查,但是会导致类型错误。所以不允许这样创建。
    
  4. 可变参数数组警告。

    我们知道可变参数类型例如

    public Integer max(Integer ...args) {
        // ...
    }
    

    此时Integer ...args本质是一个数组。

    所以如果是下面这样

    public <T> T max(T ...args, Comparator<T> comparator) {
        // ...
    }
    

    T ...args不就相当于创建了一个参数化类型的数组吗?这违反了第三条。但是在这种情况下规则会放松,你会得到一个警告而不是错误。可以使用@SafeVarargs来压制错误。

    但其实风险并没有解除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值