Java中的泛型(1)

作者: 沪上最强亚巴顿 | 来源:发表于2015-10-23 09:45 被阅读980次

自java 1.5发行版本后,java中正式加入了泛型(Generic).它提供了一下的优势:
1. 提供了更加严格的编译时类型检查. 例如,向声明为List<String>的列表中添加int值,直接在编译时就会出错.
2. 消除了类型的cast. 同前面的列表中,取出来的直接就是String类型的元素.不再需要像之前的List一样,对取出的元素进行目标类型的cast.
3. 实现了generic algorithm. 这是显而易见的.
不过,我们接着就会看到,java中的泛型是伪泛型的.这主要是由于编译器的Type Erasure机制导致的.
* 为了应对这种运行时不可用的类型, 在运行时, 将对象的类型信息分为两种.
* 一种是类型信息是可用的,成为Reifiable type. 包括所有非泛型的类型.
* 而另一种称为non-Reifiable type, 它是指类型信息在运行时比编译时类型更少的类型, 包括经过type erasure之后的类型.
* 另外, 对non-Reifiable type有两个限制: 不能出现在instanceof表达式中, 或者作为数组中的元素.
由于Type Erasure而引发的伪泛型特征,导致了很多编程上的问题.

  • 首先,让我们看一个泛型继承的例子.
class Node<T>{
    void setData(T data);
}
class StringNode<String>{
    void setData(String data);
}

由于type erasure机制,编译时会将父类的setData方法的参数类型erase为Object,从而导致StringNode并没有override setData方法.
为了保证多态性, 编译器会生成bridge方法.针对上面的例子,会在StringNode类中生产以下的bridge方法.

void setData(Object data){
    this.setData((String)data;
}
  • 当一个参数化类型的变量(如List<String>)指向一个非参数化的对象(如List)时.会引发所谓的Heap Pollution问题,例如可能会将Number实例添加到String的List中. 编译器会对这种情况发出unchecked warning. 常见的有以下两种场景:

    1. 混用raw type和parameterized type.
    2. 进行unchecked cast.
  • 泛型的非协变性(invariant). 引用Java官方文档的例图说明


例如,有一个方法:

void printList(List<Object> list);

该方法是无法接收List<String>作为参数的.这是非协变性带来的继承性丢失.

相关文章

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • java 泛型解析

    Java 泛型 1、泛型的精髓是什么 2、泛型方法如何使用 概述: 泛型在java中具有重要地位,在面向对象编程模...

  • 泛型(一)

    1. Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化...

  • 赢在面试之Java泛型篇

    1、Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类...

  • Java泛型面试题

    1.Java中的泛型是什么 ? 使用泛型的好处是什么?以及各个版本有何区别? 答:泛型是 Java SE 1.5 ...

  • 泛型常见的面试题

    1. Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中...

  • JAVA泛型的理解

    泛型大家都接触的不少,但是由于Java历史原因,Java中泛型一直被称为伪泛型,因此对Java中的泛型,有很多不注...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Kotlin 泛型

    Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类: 泛型函数: 类型变异 Java 的泛型中,最难理...

  • java的泛型机制

    <1>:java的泛型机制是javase1.5引入的 <2>:泛型擦除的概念:java中的泛型在编译之后生成的字节...

网友评论

    本文标题:Java中的泛型(1)

    本文链接:https://www.haomeiwen.com/subject/rmpthttx.html