zoukankan      html  css  js  c++  java
  • 初学java之12 泛型编程的个人理解总结

    首先,强调一个观点:

    对于我这样的初学者,一定要站在虚拟机和编译器的角度来分析java 语言的种种特性,泛型也不例外。(我认为这个一条正确的学习经验)

    写这篇文章起源于最近在学java,有一天在路上和一个同事在讨论什么是java泛型的时候,发现有些概念非常模糊。于是,我想澄清一下,并记录下来。

    希望看过的朋友能够纠正里面的错误。非常感谢。

    1 关于Java 泛型机制

    在java 最初版本,

    Java 泛型是通过 继承实现的,我认为 这里的继承,不是类的继承而是类型的继承.

    example

    public class Test

    {

       Object var;

       Object  getVar();

       Void setVar( Object );

    }

    这是一个类.

    泛型应用是这样做的

    Test testObj= new =Test();

    class A

    {}

    A a = new A();

    a = (A)getVar();

    因为A类 是Object类的子类,这样的话,通过类型强制转换,就可以实现赋值。

    class B ,class C等等 道理一样。

    通过这种方式实现和C++ 泛型一样的效果。唯一需要注意的地方在于类型转换,类型判断这些类型相关的操作需要程序员干预。

    我猜测,Java 的泛型机制就是建立在类型继承这个基础上,后面版本的泛型 本质上也是这样做的

    2 关于泛型的类型擦除

    作为一个泛型类的开发人员,我们定义了一个泛型类,

    比如

    example

    public class Test<T>

    {

       T var;

       T getVar();

       Void setVar( T t);

    }

    说明,这个的T 是一个相对于class Test 的类型参数,(可以类比: 在 void func( int x )  中,int x是相对于method : func 的类型参数,x 是类型变量一样,)

    这个泛型类在编译器中会被做一些处理而生成一个类文件。

     选择原始类型(比如Object类),替代 类定义内的所有 T ,

    将<T> 抹去

    结果是生成的类文件效果等同于

    public class Test

    {

       Object  var;

       Object getVar();

       void setVar( Object t);

    }

    这个过程就叫做java 泛型类型擦除。

    这个过程说明什么呢?

    说明对于编译器而言,是不存在什么Test<String>类,Test<Date>类等等的。

    对于Test<xx> 各种对象,它们都属于同一个类 Test ;

    但要注意,编译器看到泛型格式<T >,编译会做一些额外的事情,比如类型转换,桥方法等等。编译器在这里把以前程序员需要手动做的事情给做。

    毕竟程序员写的代码是要给编译器看懂的。通过泛型一些约定的规则,让程序员的意图为编译器所准确知道,这样写出的代码才不会有问题。

    3泛型类型的继承问题

    首先,继承是一个类,类型之间关系的问题,所以就和对象没有关系.对象之间不存在继承的问题。

    在上面的分析中,我们知道编译器不会产生具体类型参数的类。只会生成一个原始类型的普通类。即只有一个类。

    那么这里又何来 泛型类型的继承问题呢?

    我的理解是: 类型的继承和类的继承不是同一个概念,应该说,类型继承是类型继承,类继承也是类型继承,但类型继承就不一定是类继承

    Texample : Test<String > 是 Test 的一个子类型, 并不是:  Test<String >  是一个类,Test 是另一个类,Test<String >Test 的子类.

    在继承这个概念中,类型继承是一个超类,而类继承是一个子类。,类继承也是类型继承的一种情况,而不能说因为A类型是继承B类型,就推导出A是一个类,B是另一个类。A是B的子类。

    我不知道UML里面是不是这样定义的。

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/fleetwgx/p/5638120.html
Copyright © 2011-2022 走看看