Java泛型类

使用泛型(也叫通用),可以在不知道代码操作的对象的类型的情况下编写代码。 它允许创建通用类,构造函数和方法。泛型类是使用形式类型参数定义的。
形式类型参数是一个逗号分隔的变量名列表,放在类声明中类名后的尖括号<>中。

语法

下面的代码声明一个类Wrapper,它接受一个形式类型参数:

public class Wrapper<T>  {

}

上代码中,参数已命名为TT是一个类型变量,它可以是Java中的任何引用类型,例如:StringIntegerDouble等。

当使用Wrapper类时,要指定形式类型参数值。

实际参数

采用形式类型参数的类也称为参数化类。可以声明Wrapper类的变量,将String类型指定为其形式类型参数的值,如下所示。

Wrapper<String> stringWrapper;

这里,String是实际的类型参数。
Java允许使用一个泛型类不指定形式类型参数。

用法

这是为了向后兼容。还可以声明Wrapper <T>类的变量,如下所示:

Wrapper  aRawWrapper;

当使用通用类而不指定实际的类型参数时,它被称为原始类型。 上面的声明使用Wrapper <T>类作为原始类型,因为它没有指定T类型的值。

通用类的实际类型参数必须是引用类型。原始类型不允许作为通用类的实际类型参数。
类可以采用多个正式类型参数。 下面的代码声明一个Mapper类,它接受两个形式参数TR

public class Mapper<T, R>    {

}

可以声明Mapper <T,R>类的变量如下:

Mapper<String, Integer>  mapper;

这里,实际的类型参数是StringInteger。形式类型参数在类体中可用作类型。

public class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

Wrapper <T>类使用形式类型参数来声明实例变量obj,以声明其构造函数和set()方法的形式参数,以及作为get()方法的返回类型。

可以通过为构造函数指定实际的类型参数来创建泛型类型的对象,如下所示:

Wrapper<String> w1  = new Wrapper<String>("Hello");

也可以省略实际的类型参数。 在下面的代码中,省略指定String类型,编译器会将构造函数的实际类型参数推断为String

Wrapper<String> w1  = new Wrapper<>("Hello");

当声明了泛型类的一个变量,可以把形式类型参数看作是指定的实际类型参数。现在,可以认为,对于w1Wrapper类的get()方法返回一个String

String s1=  w1.get();

示例

以下代码显示如何使用Wrapper类。

public class Main {
  public static void main(String[] args) {
    Wrapper<String> w1 = new Wrapper<>("Hello");
    String s1 = w1.get();
    System.out.println("s1=" + s1);

    w1.set("Testing generics");
    String s2 = w1.get();
    System.out.println("s2=" + s2);

    w1.set(null);
    String s3 = w1.get();
    System.out.println("s3=" + s3);
  }
}

class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

执行上面代码,输出结果如下 -

s1=Hello
s2=Testing generics
s3=null

上一篇:Java抽象类和方法

下一篇:Java泛型约束

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程