Java 泛型数组

Java 不支持泛型数组。也就是说,

[java] view plaincopy

  1. List<String>[] ls = new ArrayList<String>[10];

是不支持的,而

[java] view plaincopy

  1. List<String>[] ls = new ArrayList[10]

却可以。

是我一直不清楚为什么不能够声明泛型的数组,指定类型可以让编译的时候不会出现类型安全的提示。

直到今天我看到Sun的一篇文档才清楚,里面提到了一种情况:

[java] view plaincopy

  1. List<String>[] lsa = new List<String>[10]; // Not really allowed.
  2. Object o = lsa;
  3. Object[] oa = (Object[]) o;
  4. List<Integer> li = new ArrayList<Integer>();
  5. li.add(new Integer(3));
  6. oa[1] = li; // Unsound, but passes run time store check
  7. String s = lsa[1].get(0); // Run-time error: ClassCastException.

这种情况下,由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList<Integer>而不会出现ArrayStoreException,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。

基于以上的原因,Java不支持声明泛型数组,更确切地表达是:数组的类型不可以是类型变量,除非是采用通配符的方式,看下面这个例子:

[java] view plaincopy

  1. List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.
  2. Object o = lsa;
  3. Object[] oa = (Object[]) o;
  4. List<Integer> li = new ArrayList<Integer>();
  5. li.add(new Integer(3));
  6. oa[1] = li; // Correct.
  7. String s = (String) lsa[1].get(0); // Run time error, but cast is explicit.

因为对于通配符的方式,最后取出数据是要做显式的类型转换的,所以并不会存在上一个例子的问题。

时间: 2024-10-23 09:11:13

Java 泛型数组的相关文章

java泛型数组

转载自http://blog.csdn.net/orzlzro/article/details/7017435 Java 不支持泛型数组.也就是说, List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 List<String>[] ls = new ArrayList[10] 却可以. 看到sun的一篇文档才清楚,里面提到了一种情况: List<String>[] lsa = new List<

Java泛型Generics

转载请标明出处: http://blog.csdn.net/wu_wxc/article/details/51493181 泛型 泛型是JDK 5中引入的一个新特性 在尖括号中包含的是形式类型参数,可以在整个类的声明中被使用,当类被使用时,会使用具体的实际类型参数来代替 形式类型参数的命名:尽量使用单个大写字母 普通泛型 一个泛型类型 package cn.wuxiaocheng; class Person<T> { // 标识符可以随便写,T是type的简称 private T name;

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)

JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型  其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1.str2的值是可变的.而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和st

Java 泛型 泛型数组

直接创建泛型数组不能通过编译,而转型对象数组通过编译但是不能在JVM运行 public class ArrayOfGeneric{ static Generic<Integer>[] gia; @SupperssWarnings("unchecked") public static void main(String[] args){ gia = (Generic<Integer>[])new Generic[100]; // 通过类型转换匿名对象 //! gia

JAVA建立泛型数组

java本身并不支持泛型数组,如new一个指定类型的泛型数组则会报错 即 List<Integer> list=new ArrayList<Integer>()[10]; 如需使jvm接受这种写法,需将ArraList中的Integer去掉,即让jvm分配空间时以未知类型来进行分配, 同时,跟普通数组一样,要对成员进行操作,还需要逐个对其中成员进行重新new(初始化)

java创建泛型数组

java中创建泛型数组并不是不可能,创建泛型数组通过反射,给构造函数传递两个参数,一个类型标记,一个数组大小.' 简单Demo如下: import java.lang.reflect.Array; /** * 创建泛型数组 * @author hetiantian */ public class GenericArrayWithTypeToken<T> { private T[] array; public GenericArrayWithTypeToken(Class<T> ty

Java中泛型数组创建总结

在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size)的方式来创建数组例如下面的程序. public class ArrayMaker<T> { private Class<T> type; public ArrayMaker(Class<T> type) { this.type = type; } @SuppressWarn

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型. 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上<T>,如下格式所示: [访问权限]  interface 接口名称<泛型标识>{} interface Info<T>{ // 在接口上

JAVA泛型中的类型擦除及为什么不支持泛型数组

一,数组的协变性(covariant array type)及集合的非协变性 设有Circle类和Square类继承自Shape类. 关于数组的协变性,看代码: public static double totalArea(Shape[] arr){ double total = 0; for (Shape shape : arr) { if(shape != null) total += shape.area(); } return total; } 如果给 totalArray(Shape[