[JAVA] 9. JAVA中的泛型

Posted modai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JAVA] 9. JAVA中的泛型相关的知识,希望对你有一定的参考价值。

泛型类

当我们需要创建一个类,其中的参数类型,需要后期给定的时候,就需要重新更改类型,再次创建,如下:

public class List {
    private int[] items = new int[10];
    private int count;
    public void push(int item){
        items[count++] = item;
    }

    public int get(int index) {
        return items[index];
    }
}

当我们这里想要一个UserList的时候,需要将元素的类型改为User,这样还需要重复创建结构一样的类,显然有些冗余,那么如何解决这个问题,一个很poor的方法,就是声明类型时,把元素类型定为Object,这样可以传入所有类型的变量。

public static void main(String[] args) {
        var objectList = new ObjectList();
        objectList.push(1);
        objectList.push("123");
        objectList.push(new User());
        int first = (int) objectList.get(1);
//        System.out.println(objectList.get(2));
    }

但是在使用变量的时候,如果需要根据类型选择,在编写代码上会较为复杂。


下面使用泛型定义

public class GenericList<T> {
    private T[] items = (T[]) new Object[10];
    private int count;
    public void push(T item){
        items[count++] = item;
    }

    public T get(int index) {
        return items[index];
    }
}

之后在main中创建调用。

public class Main {

    public static void main(String[] args) {
        var list = new GenericList<Integer>();
        list.push(1); //boxing
        list.get(0); //unboxing

    }
}

可以看到T赋值为了包装类Integer,但是传入参数的时候,是一个int类型的原始变量,这里编译器会默认调用包装类,进行包装,当获取这个元素的时候,会进行解包。

泛型函数

可以不将类声明为泛型,只将其中的函数声明为泛型函数,如下面的工具类中的函数:

比较数字

public class Utils {
    // 在工具类方法中,常声明为static,这样就不用实例化了
    public static int max(int first, int second) {
        return (first > second) ? first : second;
    }
}

比较泛型函数

public class Utils {
    // 在工具类方法中,常声明为static,这样就不用实例化了
    public static <T extends Comparable<T>> T max(T first, T second) {
        return (first.compareTo(second)>0) ? first : second;
    }
}

这里需要将参数类型写做 T ,将返回值类型写作 T ,并注意,要加入泛型声明<T>,为了比较两个对象,这个泛型需要继承Comparable接口,并将接口的泛型设置为T,之后函数体内可以调用参数为T类型的compareTo函数。

以上是关于[JAVA] 9. JAVA中的泛型的主要内容,如果未能解决你的问题,请参考以下文章

C#中的泛型是啥意思?

Java中的泛型的问题?

java中的泛型

Java 基础语法详解 Java 中的泛型

Java 基础语法详解 Java 中的泛型

浅谈Java中的泛型