美文网首页
泛型程序设计---基本概念

泛型程序设计---基本概念

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-01-02 10:59 被阅读0次

泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用

1.类型参数的好处

 在Java中增加泛型类之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用的数组。当获取一个值时必须进行强制类型转换。

 如今,ArrayList类有一个类型参数用来指示元素的类型

ArrayList<String> files = new ArrayList();

 这使得代码具有更好的可读性

2.通配符类型的好处

 但是,实现一个泛型类并没有那么容易。对于类型参数,程序员们可能想内置所有的类。例如:ArrayList类有一个方法addAll用来添加另一个集合的全部元素,可能想要将ArrayList<Manager>中的所有元素添加到ArrayList<Employee>中去。然而,反过来就不行了。

 Java语言的设计者发明了一个具有独创性的新概念---通配符类型,解决了上述问题。通配符类型非常抽象,然而,它们能让库的构建者编写出尽可能灵活的方法。

3.定义简单的泛型类和泛型方法

 一个泛型类就是具有一个或多个类型变量的类。例如:

  • 泛型类
public class Pair<T> {
      private T first;
      private T second;
      
      public Pair() {first = null; second = null;}
      public Pair(T first, T second) {this.first = first; this.second = second;}

      public T getFirst() {retrun first;}
      public T getSecond() {return second;}

      public void setFirst(T newValue) {first = newValue;}
      public void setSecond(T newValue) {second = newValue;}
}

 Pair类引入了一个类型变量T,用尖括号< >括起来,并放在类名的后面。泛型类可以有多个类型变量。例如,可以定义Pair类,其中第一个域和第二个域使用不同的类型:

public class Pair<T, U> {...}
  • 泛型方法
     定义一个带有类型参数方法:
class ArrayAlg {
    public static <T> T getMiddle(T... a) {
           return a[a.length / 2];
      }
}

 这是一个泛型方法,可以从尖括号和类型变量看出这一点。类型变量在修饰符(public static)的面,返回类型后面。泛型方法可以定义在普通类中,也可以定义在泛型类中。

4.类型变量的限定

 有时,类或方法需要对类型变量加以约束。例,计算数组中最小的元素:

class ArrayAlg {
    public static <T> T min(T[] a) {
        if(a == null || a.length == 0) return null;
        T smallest = a[0];
        for (int i = 1; i < a.length; i++)
            if(smallest.compareTo(a[i] > 0)) smallest = a[i];
          return smallest;
    }
}

 变量smallest类型为T,这意味着它可以是任何一个类的对象。怎样才能确信T所属的类有compareTo方法呢?可以将T限制为实现了Comparable接口的类。可以通过对类型变量T设置限定实现这一点:

public static <T extends Comparable> T min(T[] a)...

 下面的记法:

<T extends BoundingType>

表示T应该是绑定类型子类型T和绑定类型可以是,也可以是接口。一个类型变量或是通配符可以有多个限定,例如:

T extends Comparable & Serializable

 限定类型用"&"分隔,而逗号用来分隔类型变量。限定中至多有一个类,如果用一个类作为限定,它必须是限定列表中的第一个

5.泛型代码和虚拟机

  • 虚拟机中没有泛型,只有普通的类和方法
  • 所有的类型参数都用他们的限定类型替换,没有限定类型的用Object替换
  • 桥方法被合成来保持多态
  • 为保持类型安全性,必要时插入强制类型转换

相关文章

  • Java泛型与Kotlin泛型

    正文 本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别。 什么泛型 泛型程序设计是程序设计的一...

  • 泛型程序设计

    泛型程序设计 为什么要使用泛型程序设计 类型参数使程序具有更好的可读性和安全性 定义简单泛型类 泛型方法 类型变量...

  • 前端深入理解Typescript泛型概念

    首先介绍一下泛型的概念 泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型...

  • Rust中的泛型

    [TOC] Rust中的泛型 泛型程序设计是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写...

  • 泛型程序设计---基本概念

     泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。 1.类型参数的好处  在Java中增加泛型类之前,...

  • C++模板

    C++模板和泛型程序设计 泛型程序设计(generic programming)是一种算法在实现时不指定具体要操作...

  • kotlin-----理解kotlin中的泛型和注解

    一、泛型 泛型是什么? 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,...

  • Java学习总结之泛型程序设计

    泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如ArrayList类可以聚集任何类型...

  • 第8章 泛型程序设计

    第8章 泛型程序设计 使用泛型要比直接使用Object,让后进行强制类型转换要安全 8.1 为什么要使用泛型程序设...

  • JAVA泛型程序设计的意义

    为什么要使用泛型程序设计 泛型程序设计意味着编写的代码可以被不同类型的对象所重用。 参数类型的好处 在Java增加...

网友评论

      本文标题:泛型程序设计---基本概念

      本文链接:https://www.haomeiwen.com/subject/ylrjkqtx.html