请选择 进入手机版 | 继续访问电脑版

好程序员-千锋教育旗下高端IT职业教育品牌

400-811-9990
我的账户
好程序员

专注高端IT职业培训

亲爱的猿猿,欢迎!

已有账号,请

如尚未注册?

[JavaEE] 好程序员Java学习路线分享java为什么不支持泛型数组

[复制链接]
本篇文章好程序员Java培训为大家一下java为什么不支持泛型数组,希望对大家有所帮助。
public class Pair<T> {
    public void info( )
    {
        System.out.println("I am Pair");
    }
}
Pair<String>[] p=new Pair<String>[10];//该句编程环境会提示错误,连编译都不能通过
Java为什么使用泛型?
首先,从一个问题讲起——Java为什么使用泛型?引入泛型的目的之一就是为了提高程序的安全性,减少错误发生,还是用一段更形象的代码来讲吧。请看下面代码
public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add(new Pair());
        //list.add(5);Pair p=(Pair)list.get(0);
        p.info();
    }
}
运行上面代码是不会有任何问题的,但是我们稍加改动,即放开被注释掉的那行代码,并将索引改为1,即变为如下代码
public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add(new Pair());
        list.add(5);
        Pair p=(Pair)list.get(1);
        p.info();
    }
}
程序将发生java.lang.ClassCastException,很显然,是因为我们把int类型强制转为Pair类型发生的。以上代码是用引入泛型代码之前的方式写的,在引入泛型后,java集合都已经重写以迎合泛型。引入泛型的目的之一就是为了消除这种隐患,于是,泛型的一个原则被引了出来——如果一段代码在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClasscastException异常。
我们再用泛型的方式来重写一遍上面的代码,如下
图片2.png
编译环境会提示错误,编译都通不过,于是这便在编译阶段就避免了这种隐患的发生。泛型能够保证类型的统一。
为什么不能创建泛型数组?
这跟数组的一个特点有关,看代码
public class Father {

}

public class Son extends Father{

}

public class Test {
    public static void main(String[] args) {
        Father[] son=new Son[10];
    }
}
数组是允许把一个子类数组赋给一个父类数组变量的!这会发生什么!?
public class Test {
    public static void main(String[] args) {
        Pair<String>[] p = new Pair<String>[10];//实际这句是不能通过编译的,会提示错误Object[] oj = p;
    }
}
如果允许创建泛型数组,将能在数组p里存放任何类的对象,并且能够通过编译,因为在编译阶段p被认为是一个Object[ ],也就是p里面可以放一个int,也可以放一个Pair,当我们取出里面的int,并强制转换为Pair,调用它的info()时会怎样?
java.lang.ClassCastException!这就违反了泛型引入的原则。所以,Java不允许创建泛型数组。
有人可能会说,即使我用泛型ArrayList<Pair> list=new ArrayList<Pair>( ),我不是照样可以取出里面的对象,使用显式的强制类型转换吗?比如,Father f=(Father)list.get(0),实际操作你将会发现,你依旧会被提示错误,编译不过,这并不违背泛型引入的原则。
好程序员Java培训官网:http://www.goodprogrammer.org/

精彩内容,一键分享给更多人!
回复

使用道具 举报

您需要登录后才可以回帖

本版积分规则

关注我们
好程序员
千锋好程序员

北京校区(总部):北京市海淀区宝盛北里西区28号中关村智诚科创大厦

深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619

杭州龙驰智慧谷校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层

郑州校区:郑州市二七区航海中路60号海为科技园C区10层、12层

Copyright 2007-2019 北京千锋互联科技有限公司 .All Right

京ICP备12003911号-5 京公安网11010802011455号

请您保持通讯畅通1对1咨询马上开启