• 初学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里面是不是这样定义的。

  • 相关阅读:
    Windows编程--线程的睡眠方式
    Windows编程-- 等待函数
    Windows编程--线程的切换
    Windows编程-- 用户方式中线程的同步关键代码段(临界区)
    Windows编程--挂起和恢复线程的运行
    Windows编程-- 用户方式中线程的同步原子访问:互锁的函数家族
    Windows编程--线程之GetExitCodeThread()
    Windows编程-- 对Critical Section的封装
    Windows编程--线程的身份标识
    如何在oracle中限制返回结果集的大小
  • 原文地址:https://www.cnblogs.com/fleetwgx/p/5638120.html
Copyright © 2020-2023  润新知