JAVA泛型-自动包装机制不能应用于泛型数据的测试

《thinging in java》中指出自动包装机制不能应用于泛型数据,自己写的测试代码如下:

 1 package com.xt.thinks15_11_1;
 2
 3 import java.util.Arrays;
 4
 5 /**
 6  * 自动包装在泛型数组的测试
 7  *
 8  * @author Administrator
 9  *
10  */
11 public class AutoBoxGenericTest {
12
13     public static <T> void antoBoxGeneric(T[] ts, T t) {
14         // ts[0] = 1 ;//当假设T指定为Integer的时候,是没有ts[0]=1这种指定方式的
15         for (int i = 0; i < ts.length; i++) {
16             ts[i] = t;
17         }
18         System.out.println(Arrays.toString(ts));
19     }
20
21     public static void main(String[] args) {
22         // 这里虽然看似能够自动包装int为Integer,但是都是假象,具体看反汇编字节码命令
23         antoBoxGeneric(new Integer[5], 1);
24     }
25
26 }

反汇编字节码命令中红色圈出的部分显示了执行了Integer的静态方法valueOf将1转成了Integer(这里不是针对泛型的时候转型,而是执行泛型方法之前执行的转型)

javap这个命令还是有很大的好处的

时间: 2024-09-29 17:35:52

JAVA泛型-自动包装机制不能应用于泛型数据的测试的相关文章

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Java泛型解析(03):虚拟机执行泛型代码

Java泛型解析(03):虚拟机执行泛型代码 Java虚拟机是不存在泛型类型对象的,所有的对象都属于普通类,甚至在泛型实现的早起版本中,可以将使用泛型的程序编译为在1.0虚拟机上能够运行的class文件,这个向后兼容性后期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码,是不能运行在Java5.0之前的虚拟机的,这样就导致了一些实际生产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这个问题,需要先了解一下虚拟机是怎么执行泛型代码的. 虚拟机的一种机制:擦除类型参数,并将其替换成特

java从基础知识(八)泛型

1.什么是泛型? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制类型转换错

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 泛型实例详解(普通泛型、 通配符、 泛型接口)

java 泛型详解(普通泛型. 通配符. 泛型接口) 2013-02-04 19:49:49| 分类: JAVA | 标签:java |举报|字号 订阅 下载LOFTER客户端 JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String

java.基础、集合、枚举、泛型、

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具 * myeclipse:是一个收费的插件,破解myeclipse, ** 安装目录的要求: 不能有中文和空格 ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 * 破解myeclipse ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用 * 创建一个工程 - 类型 java project web project - 选择依赖的jdk,可以

java核心学习(四十一) 反射和泛型

JDK5以后,Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如String.class的类型是Class<String>,如果Class对应的类暂时未知,则使用Class<?>.通过反射中使用泛型,可以避免使用反射生成的对象需要强制转换类型. java对于类型的抽象,有两个类:Type.ParameterizedType ,第一个类单纯的代表各种基本类型和引用类型,而第二个类代表包含泛型的引用类型. 首先通过getGenericType方法可以获得泛型引用类型的

java为什么要用类型擦除实现泛型?

为什么需要泛型? 试想你需要一个简单的容器类,或者说句柄类,比如要存放一个苹果的篮子,那你可以这样简单的实现: class Fruit{} class Apple extends Fruit{} class Bucket{ private Apple apple; public void set(Apple apple){ this.apple = apple; } java学习群669823128 public Apple get(){ return this.apple; } } 这样一个简

Java语法糖(3):泛型

泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args){List list = new ArrayList();list.add("123");list.add("456"); System.out.println((String)list.get(0));}当然这是完全允许的,因为List里面的内容是Object类型的,自然任何对象类型都可以放入.都可以