Java 形参怎么写入泛型

在 Java 中,我们可以使用泛型来在方法、类或接口中定义一种通用的类型。通过使用泛型,我们可以编写更加灵活和可重用的代码,同时提高程序的类型安全性。

泛型形参的定义

泛型形参是在方法、类或接口的定义中使用的一种特殊类型。在 Java 中,我们使用尖括号(<>)来指定泛型形参。通常,我们使用单个大写字母来表示泛型形参,如TEK等。

下面是一个简单的示例,展示了如何在方法中使用泛型形参:

public class GenericMethodExample {

    // 泛型方法
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Integer[] integers = {1, 2, 3, 4, 5};
        Double[] doubles = {1.1, 2.2, 3.3, 4.4, 5.5};
        String[] strings = {"Hello", "World"};

        // 调用泛型方法
        printArray(integers);
        printArray(doubles);
        printArray(strings);
    }
}

在上面的示例中,我们定义了一个名为printArray的泛型方法,它接受一个泛型数组作为参数并打印数组的元素。在方法定义中,我们使用了尖括号(<>)来指定泛型形参T,然后在方法体中可以像使用普通类型一样使用T

泛型形参的限定

有时候,我们希望对泛型形参进行一些限制,例如只接受特定类型的参数。为了实现这一目的,我们可以使用泛型形参的限定。

下面是一个示例,展示了如何使用泛型形参的限定:

public class GenericMethodExample {

    // 泛型方法,接受实现了 Comparable 接口的类型
    public static <T extends Comparable<T>> T maximum(T a, T b, T c) {
        T max = a;
        if (b.compareTo(max) > 0) {
            max = b;
        }
        if (c.compareTo(max) > 0) {
            max = c;
        }
        return max;
    }

    public static void main(String[] args) {
        Integer intMax = maximum(3, 7, 1);
        Double doubleMax = maximum(1.5, 2.9, 0.8);
        String stringMax = maximum("Apple", "Banana", "Orange");

        System.out.println("Maximum Integer: " + intMax);
        System.out.println("Maximum Double: " + doubleMax);
        System.out.println("Maximum String: " + stringMax);
    }
}

在上面的示例中,我们定义了一个名为maximum的泛型方法,它接受三个实现了Comparable接口的泛型形参T。在方法定义中,我们使用了extends关键字来限定T必须是实现了Comparable接口的类型。通过这样的限定,我们可以在方法体中使用compareTo方法比较传入的参数。

项目方案示例

假设我们正在开发一个图书管理系统,我们希望能够处理不同类型的图书。为了实现这一目的,我们可以使用泛型来定义图书类和图书管理类。

public class Book<T> {

    private T title;
    private T author;

    public Book(T title, T author) {
        this.title = title;
        this.author = author;
    }

    public T getTitle() {
        return title;
    }

    public void setTitle(T title) {
        this.title = title;
    }

    public T getAuthor() {
        return author;
    }

    public void setAuthor(T author) {
        this.author = author;
    }
}

public class Library<T extends Book<?>> {

    private List<T> books;

    public Library() {
        books = new ArrayList<>();
    }

    public void addBook(T book) {
        books.add(book);
    }

    public void displayBooks() {
        for (T book : books) {
            System.out.println("Title: " + book.getTitle() + ", Author: " + book.getAuthor());
        }
    }
}

public class Main {