java 泛型 限制 类型_Java 泛型类型的一些限制

由于泛型类型在运行时被消除,因此,对于如何使用泛型类型是有一些限制的。

限制1:不能使用new E()

不能使用泛型类型参数创建实例。例如,下面的语句是错误的:

E object = new E();

出错的原因是运行时执行的是new E(),但是运行时泛型类型E是不可用的。

限制2:不能使用new E[]

不能使用泛型类型参数创建数组。例如,下面的语句是错误的。

E[] elements = new E[capacity];

可以通过创建一个Object类型的数组,然后将它的类型转换为E[]来规避这个限制,如下所示:

E[] elements = (E[]) new Object[capacity];

但是,类型转换到(E())会导致一个免检的便已警告。该警告会出现是因为编译器无法确保在运行时类型转换能成功。例如,如果E是String,而new Object[]是Integer对象的数组,那么(String[])(new Object[])将会导致ClassCastException异常。这种类型的编译警告是对Java泛型的限制,也是无法避免的。

不能使用泛型类创建泛型数组。例如,下面的代码是错误的:

ArrayList list = new ArrayList[10];

可以使用下面的代码来规避这个限制:

ArrayList list = (ArrayList[]) new ArrayList[10];

你将会得到一个编译警告。

限制3:在静态环境下不允许类的参数是泛型类型

由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例所共享的。因此,在静态方法、数据域或者初始化语句中,为了类而引用泛型类型参数是非法的。例如,下面的代码是非法的:

public class Test {

public static void m(E o1) {  // Illegal

}

public static E o1;  // Illegal

static {

E o2;  // Illegal

}

}

限制4:异常类不能是泛型的

泛型类不能扩展java.lang.Throwable,因此,下面的类声明是非法的:

为什么?如果允许这么做,就应为MyException添加一个catch子句,如下所示:

public class MyException extends Exception {

}

JVM必须检查这个从try子句中抛出的异常以确定它是否与catch子句中指定的类型匹配。但这是不可能的,因为在运行时类型信息是不出现的。

try {

...

}

catch (MyException ex) {

...

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值