2021-04-18 10:58  阅读(116)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-class-instance.html

Java面向对象设计 - Java泛型类

使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。

泛型类是使用形式类型参数定义的。

形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。

语法

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

    public class Wrapper<T>  {
    
    }
    

该参数已命名为T.

T是一个类型变量,它可以是Java中的任何引用类型,例如String,Integer,Double等。

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

形式参数

采用形式类型参数的类也称为参数化类。

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

这里,String是实际的类型参数。

    Wrapper<String> stringWrapper;
    

Java允许我们使用泛型类而不指定形式类型参数。

用法

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

    Wrapper  aRawWrapper;
    

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

泛型类的实际类型参数必须是引用类型。

原始类型不允许作为泛型类的实际类型参数。

类可以采用多个正式类型参数。下面的代码声明一个Mapper类,它接受两个形式参数T和R:

    public class Mapper<T, R>    {
    
    }
    

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

    Mapper<String, Integer>  mapper;
    

这里,实际的类型参数是String和Integer。

形式类型参数在类体中可用作类型。

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

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

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

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

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

一旦你声明了泛型类的一个变量,你可以把形式类型参数看作是指定的实际类型参数。

现在,你可以认为,对于w1,Wrapper类的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;
      }
    }
    
点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 泛型类
上一篇
Java 抽象类和方法
下一篇
Java 泛型约束