`
longgangbai
  • 浏览: 7281505 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于JDK1.5不支持创建泛型数组的解决方案

阅读更多

      在项目中需要将页面接受的枚举集合转换为枚举数据,使用泛型:

 

 本想new一个泛型数组但是错误,显示不支持!在网上baidu一把,网上网友说不支持泛型new数据;

  报错:   T[] ts=new T[size];

 

 发现java JDK1.5不支持泛型?

 

听网友说:C#支持,但是java不支持。

 

 

网友建议采用以下形式:

java下要这么用
public class A<T> {

private T[] arr;

public A(int capacity){
arr = (T[])new Object[capacity];
System.out.println("End");
}

仍然报警告:按你的方法还真的通过了编译,但是总感觉别别扭扭的!虽然通过了,编译器还是给出了一个提示,大体意思是“使用了未检查的或者不安全的操作”

 

最终结果:

java的范型是编译器来完成的。
就说不会因为你用了范型而加快运行速度。 jdk5 中不支持“创建范型数组”,但是可以声明,或在方法中返回。
array是不支持范型的,如果不愿意用array,可以用ArrayList 。

 

其实,java不是不支持数组,而是范型是一种,特殊的类型,不能用new来实例化,这点和其他类型不同。

即便你不用 arr = new T[capacity] 不把arr声明为数组,只是声明为T arr;在你用arr实例化对象时候也会出错。

 

其实T 是指一种特殊的具体的实例的类型。

 

 

 

为了使用泛型必选强制转换为泛型,违背了泛型的初衷!

 

使用范型就是为了避免转型,提高性能,结果这个地方为了使用范型竟然还得转型,总觉得让人难以理解,是不是还有更好的解决办法?

 

不禁有点汗颜了,呜呜

 

~~~~(>_<)~~~~

 

 

采用的形式如下:

 

T[] newItems = (T[]) Array.newInstance(items.getClass().getComponentType(), items.length );

 

 

 

我写的工具类如下:

 

package com.unutrip.callcenter.vacation.utils;

import java.lang.reflect.Array;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;

/**
 *
 * @author longgangbai
 *
 */
public abstract class ArrayUtils extends org.apache.commons.lang.ArrayUtils {

 /**
  * 将一个List<T>装换为T[]
  *
  * @param <T>
  * @param list
  * @return
  */
 @SuppressWarnings("unchecked")
 public static <T> T[] list2Arrays(List<T> list) {
  if (CollectionUtils.isNotEmpty(list)) {


   Class<? extends Object> clazz = list.get(0).getClass();


   T[] ts = (T[]) Array.newInstance(clazz.getComponentType(), list.size());


   for (int i = 0; i < list.size(); i++) {
    ts[i] = list.get(i);
   }


   return ts;


  }
  return null;


 }
}

 

 

下面转载别人的东东!

 

有人在讨论为什么Java范型不支持数组http://www.blogjava.net/myqiao/archive/2005/08/08/9580.html

 

 

我想这个问题的答案是:因为这样做会破坏类型安全。核心的问题在于Java范型和C#范型存在根本区别:Java的范型停留在编译这一层,到了运行时,这些范型的信息其实是被抹掉的;而C#的范型做到了MSIL这一层。Java的做法不必修改JVM,减少了潜在的大幅改动和随之而来的风险,也许同时也反映出Java Bytecode规范在设计之初的先天不足;C#则大刀阔斧,连CLR一起改以支持更彻底的范型,换句话说,在范型这一点上,感觉C#C++一点。

 

Java中,Object[]数组可以是任何数组的父类,或者说,任何一个数组都可以向上转型成它在定义时指定元素类型的父类的数组,这个时候如果我们往里面放不同于原始数据类型 但是满足后来使用的父类类型的话,编译不会有问题,但是在运行时会检查加入数组的对象的类型,于是会抛ArrayStoreException

 

String[] strArray = new String[20];

Object[] objArray = strArray;

objArray[0] = new Integer(1); // throws ArrayStoreException at runtime

 

因为Java的范型会在编译后将类型信息抹掉,这样如果Java允许我们使用类似

 

Map<Integer, String>[] mapArray = new Map<Integer, String>[20];

 

这样的语句的话,我们在随后的代码中可以把它转型为Object[]然后往里面放Map<Double, String>实例。这样做不但编译器不能发现类型错误,就连运行时的数组存储检查对它也无能为力,它能看到的是我们往里面放Map的对象,我们定义的<Integer, String>在这个时候已经被抹掉了,于是而对它而言,只要是Map,都是合法的。想想看,我们本来定义的是装Map<Integer, String>的数组,结果我们却可以往里面放任何Map,接下来如果有代码试图按原有的定义去取值,后果是什么不言自明。

 

所以,Java编译器不允许我们new范型数组。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JDK1.5新特性泛型_深入研究.doc

    JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究

    jdk1.5新特性,泛型,for:each

    Java开发工具包(JDK)1.5是一个重要的版本,引入了多项显著...总的来说,JDK 1.5的泛型和foreach循环是Java语言的重要进步,它们提升了代码的类型安全性和可读性,减少了出错的可能性,是现代Java开发不可或缺的工具。

    jdk1.5x64位 windows版.zip

    其次,泛型(Generics)是JDK1.5的一大亮点。泛型允许在定义类、接口和方法时指定参数类型,增强了类型检查,减少了类型转换的麻烦,同时也减少了运行时的类型错误。泛型还引入了通配符,如"? extends T"和"? super ...

    jdk1.5的新特性泛型的实例代码

    Java开发工具包(JDK)1.5引入了一项重大改进,那就是泛型(Generics)。泛型是Java编程语言中的一个关键特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。通过泛型,...

    Java-jdk1.5安装包

    Java 5.0开始支持类型推断,最显著的例子是匿名内部类和匿名对象的创建。编译器能够根据上下文推断出匿名类的类型,使得代码更加简洁。 七、可变参数(Varargs) 在JDK1.5中,开发者可以在方法签名中使用省略号(.....

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    3. **枚举(Enums)**:提供了一种新的数据类型,用于创建固定的、不可变的值集合。 4. **Annotations(注解)**:提供了一种元数据机制,可以在源代码中添加元数据,用于编译时或运行时的检查和处理。 5. **变量...

    JDK1.5的泛型实现.zip

    这是因为Java的虚拟机(JVM)不支持泛型。为了保持向后兼容,JDK 1.5采用了类型擦除技术,将泛型转化为非泛型的等效形式。 4. **通配符**:在使用泛型时,我们可以使用通配符来表示对类型的一般限制。例如,`?` ...

    JDK1.5,JDK1.5

    在JDK1.5中,反射API得到了扩展,增加了对泛型的支持,增强了对枚举类型和注解的访问。 10. **基于XML的配置(JSR 175)** JSR 175引入了注解处理,使得开发者可以通过注解来配置应用程序,而不是依赖XML配置文件...

    JDK1.5中文API文档,html格式

    虽然JDK 1.5引入了泛型,但由于历史原因,无法直接创建泛型数组。为了解决这个问题,可以使用类型通配符或者通过`Arrays.copyOf()`等方法来创建。 ### 总结 JDK 1.5的中文API文档详细列出了所有这些新特性的使用...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    JDK1.5的泛型实现.pdf

    JDK1.5的泛型实现.pdf

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    linux系统jdk1.5下载

    JDK1.5引入了一些重要的特性,如增强的for循环(foreach)、匿名内部类的改进、枚举类型以及泛型的初步支持。这些特性对Java编程产生了深远影响,提升了代码的可读性和安全性。 然而,由于JDK1.5已不再受官方支持,...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    详细介绍JDK1.5的各种新特性

    10. **枚举常量的构造函数**:在JDK1.5中,枚举类型的构造函数可以接收参数,允许创建具有不同初始状态或行为的枚举实例。 以上这些特性极大地增强了Java语言的功能和表现力,让Java开发者能够编写出更加安全、可...

    jdk1.5.rar

    Java Development Kit(JDK)是Java编程语言的软件开发工具包,它包含了编译、调试、文档生成等工具,使得开发者能够创建、测试和部署Java应用程序。JDK 1.5,也被称为Java SE 5.0(Java Standard Edition 5.0),是...

    jdk jdk1.5 windows系统

    1. **泛型(Generics)**:JDK1.5引入了泛型,使得在编写代码时可以指定容器(如ArrayList、HashMap等)存储的数据类型,提高了类型安全性和代码可读性。泛型允许在编译时期检查类型,避免了类型转换异常。 2. **...

    历史版本JDK1.5安装包

    1. 泛型(Generics): JDK 1.5引入了泛型,允许在类、接口和方法中定义类型参数,增强了代码的类型安全性,减少了类型转换的麻烦。泛型使得在编译时就能检测到可能的类型错误,而不是在运行时抛出异常。 2. 自动...

    JDK1.5、JDK5下载

    6. **类型安全的数组创建(Type-Safe Array Creation)**:通过使用泛型,可以避免在创建和使用数组时出现ClassCastException。 7. **可变参数(Varargs)**:允许函数接受任意数量的相同类型的参数,通过三个点(....

Global site tag (gtag.js) - Google Analytics