`
longgangbai
  • 浏览: 7325784 次
  • 性别: 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+tomcat6 JSONObject的jar包

    由于它是针对JDK 1.5设计的,所以在兼容性方面有很好的表现,但需要注意的是,较新的JDK版本和更现代的JSON库(如Jackson或Gson)可能提供了更多特性和性能优化,因此在新项目中,可能需要考虑使用更新的解决方案。

    jdk1.5绿色版

    JDK 1.5绿色版的出现,为那些仍然依赖此版本进行开发或测试的用户提供了一个便捷的解决方案。尽管官方已经不再提供下载,但这种珍藏版的绿色版本确保了这些用户能够继续使用并维护基于Java 5的系统。需要注意的是,...

    JDK1.5和Tomcat5.5.9.rar

    2. **文档**:查阅官方文档和社区论坛,了解已知问题和解决方案。 3. **维护**:旧版本可能不再接受安全更新,这可能导致安全隐患。确保有合适的安全措施。 4. **迁移策略**:规划一个逐步的迁移策略,以减少因升级...

    java学习笔记源代码

    通过研究这些源代码,学习者可以加深对Java语言的理解,提升编程能力,同时也能掌握实际项目开发中的常见问题和解决方案。对于初学者,这是一个宝贵的实践资源,而对于有经验的开发者,它也能提供一些启发和参考。

    黑马面试题总结

    - 设计模式是在软件设计中解决常见问题的通用解决方案。 - 主要有三大类:创建型模式、结构型模式和行为型模式。 - **常用设计模式:** - **单例模式(Singleton Pattern)**:保证一个类仅有一个实例,并提供一个...

    java加强笔记

    - `ThreadLocal`类提供了一种线程局部变量的解决方案,可以为每个线程提供独立的变量副本。 ##### 7. 多个线程之间共享数据的方式探讨 - 可以通过显式锁、同步容器等手段来实现多个线程间的共享数据操作。 ##### 8...

    史上最全阿里巴巴 JAVA 面试题总览(书签完整版)

    泛型在JDK 1.5版本中引入,用于在编译时提供类型检查和消除类型转换,主要解决类型安全问题,使代码重用。 #### 18. 序列化与反序列化 序列化是将Java对象转换成字节流的过程,而反序列化是将字节流恢复成Java对象...

    Java基础知识练习题

    - **解决方案**: - 确认所有必需的 class 文件都已编译并放置正确; - 检查 web server 的权限设置; - 确保 class 文件的包结构与 Applet 的需求一致。 #### 4. Applet 的绘图 - **问题解析**:Applet 中可以...

    JAVA 面试题总览(书签完整版)

    JDK 1.5引入泛型的目的 - 解决类型安全问题,避免强制类型转换。 - 提高代码的复用性和灵活性。 #### 28. a.hashcode()的作用及与a.equals(b)的关系 - `a.hashcode()`返回对象的哈希码,用于快速查找对象。 - 在...

    精通JBuilder2005

    这款工具为开发者提供了全面的解决方案,不仅包括了代码编辑器、编译器、调试器等功能,还集成了强大的项目管理和团队协作工具。 **1.2 新增特性** 在JBuilder2005中,增加了许多新功能来提高开发效率和软件质量。...

    Java实用教程

    - 泛型提供了一种类型安全的解决方案。 - 使用尖括号`&lt;&gt;`指定泛型参数。 - **枚举类型:** - 枚举是一种特殊的类,用于定义一组固定的常量。 - 枚举类型可以直接在代码中使用,提高了代码的可读性和维护性。 ##...

    java 讲师笔记

    4.18 单例模式和模版方法模式:设计模式是软件开发中常见的解决方案,单例模式确保一个类只有一个实例,模版方法模式定义算法的结构,把一些步骤延迟到子类实现。 4.19 Java异常处理机制:Java通过try、catch、...

    java面试笔记整理,包含java,redis,kafka等

    - **面向过程:** 侧重于定义一系列的过程来解决问题,更注重算法的设计。 #### 七、面向对象的特性 - **封装:** 将数据和行为绑定在一起,隐藏对象的内部状态。 - **继承:** 允许子类继承父类的属性和方法。 - **...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.1 继承——最优的解决方案 237 10.1.1 饭前水果:实例变量的访问控制符 237 10.1.2 一切还是从汽车开始 238 10.1.3 一类车,一个类 241 10.1.4 分开也有麻烦 244 10.1.5 使用继承——问题迎刃而解 245 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.1 继承——最优的解决方案 237 10.1.1 饭前水果:实例变量的访问控制符 237 10.1.2 一切还是从汽车开始 238 10.1.3 一类车,一个类 241 10.1.4 分开也有麻烦 244 10.1.5 使用继承——问题迎刃而解 245 ...

    JAVA数据结构

    不同类型的容器在创建、扩容等方面可能涉及不同的开销,合理评估并选择最佳方案对于优化整体性能非常关键。 #### 3.2 并发控制机制 多线程环境下,如何保证数据一致性成为了一个挑战。JAVA提供了多种同步工具类(如...

Global site tag (gtag.js) - Google Analytics