`

java泛型的一个陷阱-只在编译时检查(转)

阅读更多
证明:java泛型检查只在编译期有效,而反射是在运行期的调用机制

1 用反射进行put,绕过了泛型检查;
2 get时泛型会自动进行类型转换,从而导致了ClassCastException。

Map<String, String> map = new HashMap<String, String>(); 
        String key = "key"; 
        Integer val = new Integer(1); 
        Method m = HashMap.class.getDeclaredMethod("put", new Class[] { Object.class, Object.class }); 
        m.invoke(map, key, val); 
 
        System.out.println(map); //{key=1} 
        System.out.println(map.get(key)); // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 
    } 
  • 大小: 191.1 KB
分享到:
评论

相关推荐

    java泛型精华

    这意味着,如`List&lt;Integer&gt;`和`List&lt;String&gt;`在运行时实际上是同一个`List`类的不同实例,只是在编译阶段进行了类型检查。这种方式确保了类型安全性,但同时也带来了一些限制,例如泛型类型在运行时的不可知性。 #...

    Java Generics and Collections (Java泛型与集合)

    这意味着可以在编译时检查类型安全,避免了强制类型转换的需要,并减少了运行时错误。泛型通过在定义容器类(如List、Set和Map)时指定元素类型,确保插入和取出的元素类型一致。例如,`List&lt;String&gt;`只能包含字符串...

    java泛型学习

    这意味着在运行时,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 实际上是同一个类的实例。 - **构造泛型对象的挑战**:当尝试创建泛型对象的副本时,由于类型信息的缺失,通常无法直接使用构造函数或 clone 方法。例如,在...

    java泛型详解

    ### Java泛型详解 #### 一、什么是泛型? 从JDK 1.5开始,Java引入了泛型这一特性,极大地增强了编程的灵活性和代码的重用性。泛型是一种参数化的类型,允许程序员在定义类、接口或方法时使用类型参数。这样做的...

    xe7结构体泛型

    在“xe7结构体泛型”中,“xe7”可能是指一个特定的编程框架或者版本,而“结构体泛型”则表示我们正在讨论的是关于结构体(struct)的泛型实现。结构体是值类型,通常用于存储小量的数据,如坐标、尺寸或简单的记录...

    将常见的Java错误捕获为编译时错误.zip

    "error-prone_master.zip"可能包含一个名为Error Prone的工具,这是一个由Google开发的静态分析工具,用于在编译期间检测出潜在的Java编程错误。Error Prone扩展了Java编译器,能识别出许多常见的编程陷阱,并将其...

    Java各种类型转换md,学习代码

    在泛型中,虽然在编译时会进行类型检查,但实际运行时(JVM层面),所有的泛型信息都会被擦除。这意味着在运行时,泛型对象和非泛型对象是等价的,因此需要特别注意类型安全。 7. Lambda表达式与函数式接口 Java ...

    Java程序员面试可能遭遇的个专业技术陷阱解析.pdf,这是一份不错的文件

    在Java程序员的面试过程中,经常会遇到一些技术陷阱,这些陷阱可能是面试官用来测试候选人的深入理解、问题解决能力以及对核心概念的掌握程度。以下是一些常见的Java技术陷阱及其解析: 1. **内存管理与垃圾回收** ...

    java-puzzlers-sampler_java_Joshua_

    9. **泛型**:Java的泛型提供了一种在编译时检查类型安全的方法,但类型擦除特性使得泛型在运行时失去了类型信息,这可能导致一些微妙的错误。 10. **默认方法**:Java 8引入的接口默认方法允许接口中包含方法实现...

    Java Scjp 陷阱大全

    "Java SCJP 陷阱大全"显然是一份集合了Java编程中常见错误、陷阱和难点的资料,旨在帮助考生或者开发者避免在实际工作中遇到这些问题。以下将详细介绍Java SCJP考试中的一些关键知识点和常见陷阱: 1. **基本语法**...

    几本有帮助的电子书

    Java泛型是在JDK 5.0引入的新特性,它允许在类、接口和方法中使用类型参数,从而使得代码可以在编译时进行类型检查,减少运行时错误,同时提供更好的代码重用性。 1. **泛型类和泛型方法**:泛型类是带有类型参数的...

    Java OCA 考试指南带highlight

    - 泛型提供了一种方法,用来实现编译时类型安全检查和消除类型转换。 - 泛型类和方法的声明可以使用尖括号()包含类型参数。 知识点10:注解(Annotations) - 注解是一种用于为代码添加元数据的方式。 - 注解不会...

    Java An Introduction to Problem Solving and Programming

    - **类类型的参数**: 第345页提到了探索类类型的参数,这涉及到了Java泛型的使用。 - **构造器编写**: 第387页提到了构造器的编写,这是对象创建过程中的重要组成部分。 - **静态与非静态方法**: 第396页提到了...

    Java 一些值得注意的细节

    使用泛型可以避免强制类型转换,并在编译时检查类型错误。但Java的泛型是类型擦除的,运行时没有泛型信息。 11. **接口与抽象类**:接口定义了行为规范,抽象类则可以提供部分实现。一个类只能继承一个抽象类,但...

    Java基础训练源码

    5. **泛型**:泛型提供了一种在编译时确保类型安全的方式,防止在容器中存储不兼容的数据类型。源码将展示如何定义和使用泛型类、接口和方法。 6. **多线程**:Java内置了多线程支持,通过Thread类和Runnable接口...

    很容易弄错的java面试题

    如何在运行时检查泛型类型的边界?面试中可能会涉及通配符(?),如、和的使用场景。 9. **反射**:Java反射机制的应用与潜在风险。反射可以动态地获取类信息并操作对象,但过度使用可能导致性能下降和安全性问题。...

    java迷题

    Java的泛型在编译后会进行类型擦除,这意味着在运行时无法检查泛型类型的正确性,这可能导致类型安全问题。为了弥补这一点,开发者需要在编写代码时严格遵守泛型的使用规则。 8. 缺乏默认方法实现: 在Java 8之前...

    Java8中级篇--接口-异常与集合

    泛型是Java 5引入的一个重要特性,它允许在类、接口和方法中使用类型参数,从而增强了类型安全。使用泛型可以避免在运行时出现ClassCastException,并且在编译阶段就能发现类型不匹配的问题。例如,ArrayList中的T...

Global site tag (gtag.js) - Google Analytics