资讯专栏INFORMATION COLUMN

java类型擦除(java type erasure mechanism)

nodejh / 512人阅读

摘要:在之后提供了泛型,允许在定义类的时候使用类型作为参数。泛型广泛应用于各类集合中。本文对其以及其用法进行介绍。报错如下原因是类型擦除机制,在编译成文件时候,编译器并未把和类型信息编译进去。通配符和无界通配符无界通配符可接收任何类型。

在JDK5之后java提供了泛型(Java Genertics),允许在定义类的时候使用类型作为参数。泛型广泛应用于各类集合中。本文对其以及其用法进行介绍。
1. 一个常见的错误
public class Main {
    public static void main(String[] args) throws IOException {
        ArrayList al = new ArrayList();
        al.add("a");
        al.add("b");
 
        accept(al);
    }
 
    public static void accept(ArrayList al){
        for(Object o: al)
            System.out.println(o);
    }
}

似乎Object是String的父类,并没有问题。但是,编译时候是不能通过的。报错如下:

The method accept(ArrayList < Object > ) in the type Main is not applicable for the arguments 
(ArrayList < String > )
2. List vs List

原因是java类型擦除机制,在编译成class文件时候,编译器并未把Object和String类型信息编译进去。因此为了防止错误,编译器在编译时候发现他们不一致就会报错。

3. 通配符和无界通配符 (1) 无界通配符

List 可接收任何类型。

public static void main(String args[]) {
        ArrayList al = new ArrayList();
        al.add("abc");
        test(al);
    }
 
    public static void test(ArrayList al){
        for(Object e: al){//no matter what type, it will be Object
            System.out.println(e);
// in this method, because we don"t know what type ? is, we can not add anything to al. 
        }
    }
(2)通配符
List< Object > - List can contain Object or it"s subtype
 
List< ? extends Number > -  List can contain Number or its subtypes.
List< ? super Number > - List can contain Number or its supertypes.
转自我的博客园(http://www.cnblogs.com/qins/p...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70809.html

相关文章

  • Java泛型: 类型擦除(type erasure)

    摘要:泛型类型仅存在于编译期间,编译后的字节码和运行时不包含泛型信息,所有的泛型类型映射到同一份字节码。的本质泛型编译器原始类型被替换泛型编译器原始类型被替换原始类型指被编译器擦除了泛型信息后,类型变量在字节码中的具体类型。 type erasure & reified generic Java的泛型不同于C++的模板:Java泛型是type erasure,C++模板是reified g...

    nidaye 评论0 收藏0
  • Unchecked Conversion 导致的 Java 方法返回类型变更

    摘要:问题在遇到有同学反馈了个问题第一眼的感觉应该是泛型擦除和类型推断导致的但当我尝试去彻底解释这个问题的时候才发现关键原因是如果在调用方法时有那么方法返回的是定义中返回类型经过擦除后的结果具体问题是这个样子的错误不兼容的类型无法转换为猜测 问题 在 v2 遇到有同学反馈了个问题, 第一眼的感觉应该是泛型擦除(Type Erasure)和类型推断(Type Inference)导致的. 但当...

    liangzai_cool 评论0 收藏0
  • 教妹学 Java:晦涩难懂的泛型

    摘要:首先,我们来按照泛型的标准重新设计一下类。注意参数为而不是泛型。利用形式的通配符,可以实现泛型的向上转型,来看例子。需要注意的是,无法从这样类型的中取出数据。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大学的时候也学习编程吧?有一天,三妹突发奇想地问我。 你确定要做一名...

    Crazy_Coder 评论0 收藏0
  • Java泛型

    摘要:泛型的参数只可以代表类,不能代表个别对象。生成的字节代码中不包含类型信息例如编译后看到的只是静态变量是被泛型类的所有实例所共享的。对于声明为的类,访问其中的静态变量的方法仍然是。不管是通过还是创建的对象,都是共享一个静态变量。 Java泛型的参数只可以代表类,不能代表个别对象。 由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。 In Jav...

    hankkin 评论0 收藏0
  • Java泛型总结

    摘要:静态变量是被泛型类的所有实例所共享的。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。在代码中避免泛型类和原始类型的混用。参考泛型类型擦除 Java泛型总结 Java泛型是JDK5引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用的时候使用具体的类型来替换。泛型最主要的应用是在JDK5...

    CoreDump 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<