开发者社区> 问答> 正文

泛型这么写为什么是对的?报错

public static <T> void fromCollectionToArray(Collection<T> collection, T[] array) {
        int count = 0;
        for (T o : collection) {
            array[count++] = o;
        }
        count = 0;
       
        for (T l : array) {
            System.out.println(l);
        }
    }
public static void main(String[] args) {
    Integer[] ai = new Integer[3];
    List<Number> cn = new ArrayList<Number>();
        cn.add(11);
        cn.add(22);
        cn.add(33);
    fromCollectionToArray(cn, ai);
}

没有报错,Number可以赋值给Integer型?

展开
收起
爱吃鱼的程序员 2020-06-14 21:48:33 594 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    Java的数组是协变的(covariant),Integer[]是Number[]的子类,但泛型集合是非协变(invariant)的,List<Integer>不是List<Number>的子类。

    你代码main中对fromCollectionToArray的调用,实际对应的是:fromCollectionToArray(Collection<Number>collection,Number[]array),这对调用者来说是合法的,所以编译和运行应该都没有问题。

    在Java里尽量避免混合使用泛型数组和泛型集合,容易出错,而且会牺牲强类型检查,比如你在main里往cn里加浮点数3.14d,代码编译是没有任何问题的,但运行时会报错,在一定程度上失去使用泛型的意义了。

    因为 Integer是Number的子类呀。子类当然能给父类对象赋值呗多态是可以,但是不要这样用。如果这样用了,那还泛型个什么意思呢?编译通过了,但运行照样有可能出错吖。还真没试过
    2020-06-14 21:48:52
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Java基础入门(四)-泛型、反射、注解 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载