看看下面这个java小程序:
public class Test {
public static void append(List list){
list.add("asdf");
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<Integer>();
append(intList);
System.out.println(intList.get(0));
}
}
//运行结果:asdf
可能会java的朋友们有的会认为这个程序有错误。不好意思,这个程序真的没错……
这涉及到JDK1.5的“新”特性——泛型。
我们可以看到,intList使用了泛型,其中的元素应该是Integer类型的,但是上例程序中却成功的将一个String类型存入了其中,更重要的是这个String字符串根本不能转换为Integer类型。
好吧,我们不得不承认,我们成功的“穿墙”了——绕过了泛型检查。
那么,我们是怎么做到的呢?
正如你所见,虽然我们声明了一个List<Integer>类型的链表,但是,当我们把这个链表当参数传给Test类的append方法时,我们看到append方法的形参是不带泛型的。也就是说,理论上我们可以在这个传入的链表中加入任何类型的元素。
好吧,最后我们就把一个字符串加入到了intList中去了……
是不是很神奇啊?
其实不然,我们只是简单的绕过了泛型的检查而已。我说绕过了检查,那么,是谁检查的呢?
你猜对了,就是编译器!!!
编译器干了什么?
问得好!我们要知道的是,java中的泛型基本上完全是在编译器中实现的(话怎么这么绕呢),由编译器执行类型检查和类型推断,然后生成普通的无泛型的字节码。这种实现技术我们称其为擦除(erasure)。
那么好了,我们更清晰的知道在上例中我们干了什么了——我们成功“忽悠”了编译器。(心里很爽啊,原来编译器也2啊)
那么这下好了,编译器绕过了,那么你认为接下来我们是不是可以为所欲为了呢?
呵呵,你看到了,我们已经“犯罪”了,可是JVM居然还呆呆的运行着,明明intList里只能有Integer的元素,现在可好,居然把"asdf"都打印出来了。呵呵………………
为所欲为?你真以为你是神啊?
你在打印语句中打印这个东东试试:
intList.get(0).getClass()
怎么样,傻了吧?
发生了什么事?想知道?
可是,我现在只是在说怎么绕过泛型检查,好了,老实说,我已经说完了!!
你还想知道什么呢?这跟我有什么关系?
等我下次心情好的时候再跟我说吧,或许我会说点什么的!!
呵呵…………………………………………………………………………………………………………
分享到:
相关推荐
7. **泛型接口和泛型类的组合**:你可以在泛型类中实现泛型接口,也可以在非泛型类中实现泛型接口,进一步增强代码的复用性。 8. **泛型和多态**:泛型是多态的一种形式,因为它允许你用一种类型安全的方式处理不同...
1. **类型安全**:泛型提供了一种编译时的类型检查机制,确保了在使用泛型容器时,只能放入正确类型的对象。这避免了运行时的类型转换异常,提高了代码的可靠性。 2. **性能优化**:使用泛型可以避免不必要的装箱和...
在没有泛型的情况下,我们通常需要在添加元素时进行类型检查,或者在取出元素时进行类型转换,这增加了潜在的运行时错误风险。例如,`ArrayList al1` 可以存储任何类型的对象,取出时必须强制转换。而使用泛型如 `...
本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类是具有一个或多个类型参数的类。类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
引入泛型的主要目的是在编译时提供更严格的类型检查,并且减少强制类型转换的需要。使用泛型后,在集合操作中添加元素时,编译器会检查元素的数据类型,确保类型的一致性,减少运行时的类型错误。同时,泛型还提高了...
泛型学习和泛型接口和泛型经典示例
【内容】在使用Hibernate泛型Dao时,首先需要定义一个基类,比如`AbstractGenericDao<T>`,其中T代表泛型类型,对应你要操作的实体类。这个基类会包含一些通用的CRUD(Create, Read, Update, Delete)方法,如`save...
Java编程详细教程Java集合与泛型PPT教案学习.pptx
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误的可能性。泛型的主要优点是可以Reusable Code,让程序员编写更加灵活和可维护的代码。 首先,让我们了解 ...
### C# 2.0 泛型编程初级入门教程 #### 一、引言 随着.NET Framework 2.0 的发布,C# 语言引入了一系列重要的新特性,其中泛型编程便是最为突出的一个。泛型编程允许开发人员编写类型安全且可重用的组件,而无需...
### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言...希望这篇指南能帮助你更好地理解和应用 Java 泛型。
### C# 2.0中泛型编程初级入门教程 #### 泛型编程的重要性与优势 在C# 2.0版本中引入的泛型编程是面向对象编程的一个强大扩展,它允许程序员编写类型安全、可重用的代码,而无需进行运行时类型转换或使用低效的...
5. **类型擦除**:Java泛型在编译后会进行类型擦除,即在运行时,所有的泛型信息都会被移除,因此泛型并不提供运行时的类型检查。 **四、泛型与集合** Java集合框架是泛型应用最广泛的领域。例如,ArrayList、...
泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **泛型的基本概念** - 泛型的本质是在类、接口或方法中使用类型参数,让它们能够处理多种数据类型。...
其次对泛型的概念进行了解释,讨论了泛型类、泛型接口、泛型方法及其优势,最后探讨了枚举与泛型的结合使用方法。 适用人群:适用于具有一定Java编程基础的学习者和开发者,特别推荐给希望深入了解Java核心技术的...
泛型是Java SE 5.0引入的一个重要特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。下面我们将深入探讨SSH框架中泛型的应用及其重要性。 1. **Spring框架中的泛型** -...