zoukankan      html  css  js  c++  java
  • Java基础“泛型”

      什么是泛型?

      泛型实现了参数化类型的概念,使代码可以应用于多种类型。泛型最初的目的是希望类或方法能够具备最广泛的表达能力。它是通过解耦类或方法,与使用的类型之间的约束来实现。

      一般类和方法只能使用具体类型来表示成员,要么就编写可以应用与多种类型的代码,这种方式对代码的束缚会很大,使用泛型能够很好的解决这个问题。

      泛型的简单使用:

        使用泛型一般在类名之前或接口名之前定义“<T>”;其中“<>”是固定的语法,“<....>”里可以有多个泛化的类型,类型的定义一般用大写的字母定义。

        

      对于Java容器类,泛型的使用必不可少,因为容器类存储的元素不可能是定制化的,为某一个对象或者某一个具体的继承链;可能有人说,用Object做为容器成员来实现不同元素的存储。这样是可以,但是用Object存储,是属于“向上转型”;当你要得到具体类型时,需要“向下转型”,这个是不安全的。容器是存储某一类型的集合,当存储时,是固定了存储哪种类型的数据,用Object存储,没有办法判断存储的类型是不是指定存储类型,编译时不会有任何提示。

      泛型的使用能够让类得到最广泛的使用场景,同时也指定了类的具体类型,这是它最大的好处。

      在泛型表达式里定义多个对象,被称为“元组”。它是将多个对象封装在一个单一的对象中。元组的定义保持了元素的次序,比如"<A,B,C>"。

      泛型方法:

      泛型在方法中使用。需要注意,基本类型是无法作为泛化的参数类型。之所以能用,是因为在Java SE5之后具备了自动打包和拆包的功能。方法使用泛型可以作为参数和返回值使用,泛型方法的使用与其所在的类是不是泛型没有关系,也就是说方法可以自己定义泛型并使用的。泛型方法的使用能够独立于类而产生变化,如果因为类型原因方法无法进行多元化,从而只能添加扩展,这种行为不是一个好的解决方式。如果是static方法,是无法访问泛型类的泛型参数的,static方法要使用泛型参数,必须成为泛型方法。

      我们来看一个例子:

     

     

    从这个例子中我们发现,它们是相等的,为什么相等呢?这里有一个擦除机制,Java中的泛型是使用擦除来实现的。在使用泛型时,任何具体的类型信息都会被擦除,你唯一知道的就是你在使用一个对象,因此List<String>和List<Integer>在运行时事实上是相同类型,这两种形式都被擦除成“原生”类型。从这个例子的输出可以看出来,在泛型代码内部,是无法获得任何有关泛型参数类型的信息。

      

      

    在泛型代码里无法获取到泛型对象的信息,自然也就无法使用对象的一些动作。要想使用对象的一些属性和动作,需要使用泛型边界 extends 关键字“<? extends Object>”。泛型类型参数会擦除到它的第一个边界,它会把参数类型替换为擦除类型,就像Object 替换了原生类型。

  • 相关阅读:
    表达式计算 六月飞雪
    code::blocks 单步执行 六月飞雪
    5.1 字符串 六月飞雪
    对使用倒序的一维数组解决0/1背包问题的理解 六月飞雪
    5.2 高精度运算 六月飞雪
    关于ArcEngine“不能再打开其他表了”的错误 (20121026 15:43:33)
    关于AO插入对象
    多线程使用实例
    C#程序运行时间长出现无法响应状态
    Geographic coordinate system和projected coordinate
  • 原文地址:https://www.cnblogs.com/liaobudao/p/11273014.html
Copyright © 2011-2022 走看看