关于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范型数组。

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值