显然在平时使用中,ArrayList<Integer>()和new ArrayList<String>()是完全不同的类型,但是在这里,程序却的的确确会输出true。 这就是Java泛型的类型擦除造成的,因为不管是ArrayList<Integer>()还是new ArrayList<String>
分类:
编程语言 时间:
2016-03-13 10:10:19
阅读次数:
435
这节我们来总结一下JVM编译器优化问题。 JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱、拆箱与遍历循环 条件编译 JVM编译器优化 JVM的编译器可以分为三个编译器: 1、前端编译器:把.ja
分类:
其他好文 时间:
2016-02-27 18:09:51
阅读次数:
228
泛型对于老代码的支持 Java的泛型设计成类型擦除的目的,很大一部分是为了兼容老老代码。如下的一段代码: void setLabelTable(Dictionary table) table的类型是非泛型的Dictionary,但是我们可以传入泛型的Dictionary: Dictionary<In
分类:
编程语言 时间:
2016-02-01 20:39:08
阅读次数:
301
这一章节我们继续类型擦除的话题,我们将通过对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?1.数组package com.ray.ch13;
public class Test {
public static void main(String[] args) {
Fruit[] fruits = new Apple[5];
fruits[0] = new Apple();
...
分类:
编程语言 时间:
2015-12-21 10:57:26
阅读次数:
136
泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性。List myLis...
分类:
其他好文 时间:
2015-11-08 14:24:47
阅读次数:
201
1、数组的协变性数组的协变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。数组的协变性可能会导致一些错误,比如下面的代码:1234public static v...
分类:
编程语言 时间:
2015-10-31 00:14:39
阅读次数:
267
因为java虚拟机没有泛型这一说法,所以在使用java泛型时需要考虑一些限制,大多数限制都是由类型擦除引起的。1.不能用基本类型实例化类型参数 不能用类型参数代替基本类型。因此,没有Pair,只有Pair。当然其原因是类型擦除。擦除之后,Pair类含有Object类型的域,而Object不能存...
分类:
其他好文 时间:
2015-08-02 14:59:03
阅读次数:
128
任何一个泛型类型,都对应这个一个原始类型。原始类型的名字来源于带参数的泛型类型名去掉参数后的结果,并将类中用到类型变量的地方替换为类型变量的限定类型(如果没有限定类型就用Object)。下面是一个来源于《Java核心技术 卷1》的例子:
类型擦除前:
package generic;
/**
* @version 1.00 2004-05-10
* @author Cay Horstma...
分类:
编程语言 时间:
2015-06-08 17:21:06
阅读次数:
112
Java泛型-类型擦除一、概述 Java泛型在使用过程有诸多的问题,如不存在List.class, List不能赋值给List(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛...
分类:
编程语言 时间:
2015-05-25 22:16:14
阅读次数:
140