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

限制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<String> list = new ArrayList<String>[10];

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

  ArrayList<String> list = (ArrayList<String>[]) new ArrayList[10];

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

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

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

  public class Test<E> {

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

    }

    public static E o1;  // Illegal

    static {

      E o2;  // Illegal

    }

  }

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

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

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

  public class MyException<T> extends Exception {

  }

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

  try {

  ...

  }

  catch (MyException<T> ex) {

  ...

  }

Java 泛型类型的一些限制的更多相关文章

  1. Java泛型类型擦除问题

    以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List 和 List 在编译成字 ...

  2. 掌握 Java 泛型类型(一)

    为理解泛型类型为何如此有用,我们要将注意力转向 Java 语言中最容易引发错误的因素之一 - 需要不断地将表达式向下类型转换(downcast)为比其静态类型更为具体的数据类型(请参阅参考资料中的&q ...

  3. Java泛型类型擦除以及类型擦除带来的问题

    目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...

  4. Java 泛型类型基础

    为什么要使用泛型? 未使用泛型的情况: // 创建列表类 List list = new ArrayList(); // 添加一个类型为 String 的列表元素 list.add("hel ...

  5. Java,泛型类型通配符和C#对照

    c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,仅仅是语法糖,在编译器编译的时候都转换成object类型 类型通配符在java中表示的是泛型类型的父类 ...

  6. 记一次由于Java泛型类型擦除而导致的问题,及解决办法

    中所周知,Java中的泛型并不像C++.C#一样是真正的泛型,其泛型是通过类型擦除来实现的.具体什么是类型擦除,可以参看这篇博文:http://icyfenix.iteye.com/blog/1021 ...

  7. Java泛型类型擦除导致的类型转换问题

    初步结论:泛型类型转换不靠谱: 源码: package com.srie.testjava; public class TestClassDefine4<T> { public stati ...

  8. Java泛型类型

    E element 常用于集合中表示存放元素 T type Java类 K key 键 V value 值 N number 数值类型 ? 不确定的类型 一种约定俗成吧

  9. Java泛型类型擦除与运行时类型获取

    Java的泛型大家都知道是类型擦除的方式实现的,“编译器会进行泛型擦除”是一个常识了(实际擦除的是参数和自变量的类型).“类型擦除” 并非像许多开发者认为的那样,在 <..> 符号内的东西 ...

随机推荐

  1. POJ -- 3842

    An Industrial Spy   Description Industrial spying is very common for modern research labs. I am such ...

  2. 伪分布配置完成启动jobtracker和tasktracker没有启动

    检查logs目录下的hadoop-root-jobtracker日志文件 2014-02-26 19:56:06,782 FATAL org.apache.hadoop.mapred.JobTrack ...

  3. HW4.45

    public class Solution { public static void main(String[] args) { int count = 0; for(int i = 1; i < ...

  4. SQL Server Data Tool 嘹解(了解)一下 SSDT -摘自网络

    Visual Studio 2010 的伺服器管理員可以用來連接 Sharepoint.伺服器,還可以透過資料連接連結至 SQL Server  等資料來源.以資料來源為例,您可以利用單一工具(Vis ...

  5. 问题-提示“adodataset.command”

    问题现象:提示“adodataset.command” 问题原因:原因不明,希望高人指点. 问题处理:如果报adodataset.command ,如果忽略将删除控件的错误时,你应该可以看一看是不是在 ...

  6. 浅谈js观察者模式

    观察者模式又叫发布订阅模式,它可以让多个观察者对象同时监听某一个主题对象,即在一个事件发生时,不同的对象迅速对其进行相应.就比如当又人闯红灯,不同的人对这件事迅速发起响应,当然这个比喻不太恰当,不过在 ...

  7. Excel引用

    Excel引用 1.绝对引用  相对引用 A:A   左右拉的话会自动变为  B:B,C:C等等 $A:$A  左右拉的话仍然是A列 A$1:A1  上下拉的话,会变成A$1:A2,A$1:A3等等

  8. (二)在.net中如何使用Memcached

    Step1:第一步当然是下载Memcached for c# API,

  9. java反射与代理模式

    流程age: 饭前洗手----> 吃饭 --->饭后洗碗 //吃饭 public interface Dinner { //吃饭方法 public void haveDinner(); } ...

  10. APP下载页面(支持微信扫一扫)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...