资讯专栏INFORMATION COLUMN

Java泛型

hankkin / 778人阅读

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

Java泛型的参数只可以代表类,不能代表个别对象。

由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。

In Java, generics are only checked at compile time for type correctness. The generic type information is then removed via a process called type erasure, to maintain compatibility with old JVM implementations, making it unavailable at runtime.

Java编译程序在编译泛型时会自动加入类型转换的编码

For example, a List is converted to the raw type List. The compiler inserts type casts to convert the elements to the String type when they are retrieved from the list, reducing performance compared to other implementations such as C++ templates.

类型擦除

Java的泛型在编译器这个层次上实现,使用泛型的时候加上的类型参数会在编译的时候去掉。生成的Java字节代码中不包含类型信息(例如List编译后JVM看到的只是List>)

静态变量是被泛型类的所有实例所共享的。对于声明为 MyClass 的类,访问其中的静态变量的方法仍然是 MyClass.myStaticVar。不管是通过 new MyClass 还是 newMyClass 创建的对象,都是共享一个静态变量。

泛型的类型参数不能用在Java异常处理的 catch 语句中。因为异常处理是由JVM在运行时刻来进行的。由于类型信息被擦除,JVM是无法区分两个异常类型 MyExceptionMyException 的。对于JVM来说,它们都是 MyException 类型的。也就无法执行与异常对应的catch语句。

通配符

一个方法如果接收 List 作为形式参数,但是如果尝试将一个 List 的对象作为实际参数传进去 会因为实际上包含隐含的类型转换问题得到 compile err
但是如果使用 List 或者 List 则不会

    public void inspect(List list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
    }

    public void test() {
        ArrayList strs = new ArrayList();
        inspect(strs);
    }
    
    //不会报错

当泛型类的类型声明中使用了通配符的时候, 其子类型可以在两个维度上分别展开。
如对 Collection 来说

其子类型可以在 Collection 这个维度上展开,即 ListSet 等;

也可以在 Number 这个层次上展开,即 CollectionCollection 等。

如此循环下去,ArrayList和 HashSet等也都算是Collection的子类型。

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

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

相关文章

  • java编程思想》—— 泛型

    摘要:引用泛型除了方法因不能使用外部实例参数外,其他继承实现成员变量,成员方法,方法返回值等都可使用。因此,生成的字节码仅包含普通的类,接口和方法。 为什么要使用泛型程序设计? 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类的对应类型;如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----摘自原书Ordinary classes and meth...

    CODING 评论0 收藏0
  • Java知识点总结(Java泛型

    摘要:知识点总结泛型知识点总结泛型泛型泛型就是参数化类型适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是模版优点使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。 Java知识点总结(Java泛型) @(Java知识点总结)[Java, Java泛型] [toc] 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛...

    linkin 评论0 收藏0
  • 聊聊Java泛型及实现

    摘要:静态变量是被泛型类的所有实例所共享的。所以引用能完成泛型类型的检查。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。事实上,泛型类扩展都不合法。 前言 和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基本类型作为模板参数,Java却只能接受类作为泛型参数;Java可以在泛型类的方法中取得...

    lewif 评论0 收藏0
  • 浅析Java泛型

    摘要:泛型类在类的申明时指定参数,即构成了泛型类。换句话说,泛型类可以看成普通类的工厂。的作用就是指明泛型的具体类型,而类型的变量,可以用来创建泛型类的对象。只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,...

    godiscoder 评论0 收藏0
  • 初探Java类型擦除

    摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...

    DevTalking 评论0 收藏0

发表评论

0条评论

hankkin

|高级讲师

TA的文章

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