关于泛型中的类型擦除问题

原创 2018年04月17日 17:19:31

在JAVA中,我们会经常用到List<..>,其中<>中的即为泛型,在这里我想说明的是泛型从存在的类型擦除所导致的一些常见问题

贴上测试代码:

import java.util.ArrayList;
import java.util.List;
public  class test {
    public static void main(String[] args) {
        List<Integer> myInts=new ArrayList<Integer>();
        myInts.add(1);
        myInts.add(2);
        List<Number> mynums=myInts;
    }

}

结果如下


我们通常会认为由于Integer是Number的子类型,故有List<Integer>是List<Number>的子类型,但很疑惑为什么这个程序会在静态类型检查的时候报错。实际上这是由于泛型所存在的类型擦除机制,在编译时,编译器并不会将泛型具体,而是将其中的类型进行擦除。但如果用通配符却能够解决这个问题,在泛型中任何类型数据都是通配符类型的子类,我们可以认为其有父子关系

代码如下:

import java.util.ArrayList;
import java.util.List;
public  class test {
    public static void main(String[] args) {
        List<Integer> myInts=new ArrayList<Integer>();
        myInts.add(1);
        myInts.add(2);
        List<? extends Number> mynums=myInts;
        for(Number n:mynums)
        {
                System.out.println(n);
        }
    }

}

可以看出采用通配符很好的解决了由于泛型中类型擦除导致的问题

JAVA泛型-类型擦除太恶心,但项目中大量使用,以及类型擦除引起的问题及解决方法

泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void ma...
  • mack415858775
  • mack415858775
  • 2015-08-21 10:16:23
  • 7260

java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题

一、Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦...
  • wisgood
  • wisgood
  • 2013-09-17 10:32:12
  • 7603

Java 泛型,你了解类型擦除吗?

泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,...
  • briblue
  • briblue
  • 2017-08-05 22:32:18
  • 6373

使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

谷歌Gson转换Json串有如下方法: public Object fromJson(String json, Type typeOfT); 可以使用它进行数组解析。如下,使用此方法解析Json串为...
  • u013543480
  • u013543480
  • 2015-02-06 21:31:57
  • 3359

泛型与类型擦除

原创文章,转载请注明以下信息:  作者:icyfenix@gmail.com  来源:《深入理解Java虚拟机:JVM高级特性与最佳实践》  泛型是JDK 1.5的一项新特性,它的本质是...
  • u011258318
  • u011258318
  • 2015-05-12 16:20:58
  • 543

Scala 泛型类型擦除

转载:http://blog.csdn.net/wsscy2004/article/details/38440247 https://www.iteblog.com/archives/1520 ...
  • lcg910978041
  • lcg910978041
  • 2016-11-11 22:33:31
  • 653

Java泛型--编译器类型擦除

Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。       Java中的泛型基本上都是在编译器这个层次来实现的。...
  • u013467442
  • u013467442
  • 2016-11-30 17:54:06
  • 841

java基础(28)--泛型与类型擦除、泛型与继承

本文转载自:http://blog.sina.com.cn/s/blog_7ffb8dd501012ku9.html 尊重原创【泛型与类型擦除】泛型是JDK 1.5的一项新特性,它的本质是参数化类型(...
  • Mrzhoug
  • Mrzhoug
  • 2016-04-27 01:07:08
  • 677

泛型类型擦除

1、关于类型擦除 使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)/** * 使用了泛型的代码在运行期间相...
  • liupeng_qwert
  • liupeng_qwert
  • 2017-07-11 10:40:58
  • 109
收藏助手
不良信息举报
您举报文章:关于泛型中的类型擦除问题
举报原因:
原因补充:

(最多只允许输入30个字)