Java 泛型

来源:互联网 发布:我怎么投诉淘宝店铺 编辑:程序博客网 时间:2024/05/21 15:44

一、泛型

  Java泛型是JDK5中引入的一个新特性,提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型。

  假定:写一个方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,应该如何实现?
  答案是利用泛型。

二、泛型方法

  泛型方法在调用时可以接收不同类型的参数,其定义的规则如下:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
  • 每一个类型参数声明部分包含一个或者多个类型参数,参数之间用逗号隔开。一个泛型参数,也被成为一个类型变量,是用于指定一个泛型类型名称的标识符
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char等)

实例

public class Util {    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {        return p1.getKey().equals(p2.getKey()) &&               p1.getValue().equals(p2.getValue());    }}public class Pair<K, V> {    private K key;    private V value;    public Pair(K key, V value) {        this.key = key;        this.value = value;    }    public void setKey(K key) { this.key = key; }    public void setValue(V value) { this.value = value; }    public K getKey()   { return key; }    public V getValue() { return value; }}

我们可以如下调用泛型方法:

Pair<Integer, String> p1 = new Pair<>(1, "apple");Pair<Integer, String> p2 = new Pair<>(2, "pear");boolean same = Util.<Integer, String>compare(p1, p2);

或者在Java1.7/1.8利用type inference,让Java自动推导出相应的类型参数:

Pair<Integer, String> p1 = new Pair<>(1, "apple");Pair<Integer, String> p2 = new Pair<>(2, "pear");boolean same = Util.compare(p1, p2);

三、泛型类

  泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
  和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例

public class Box<T> {    // T stands for "Type"    private T t;    public void set(T t) { this.t = t; }    public T get() { return t; }}

这样我们的Box类便可以得到复用,我们可以将T替换成任何我们想要的类型:

Box<Integer> integerBox = new Box<Integer>();Box<Double> doubleBox = new Box<Double>();Box<String> stringBox = new Box<String>();
原创粉丝点击