java - 自定义泛型解释

标签 java generics interface jakarta-ee

请解释java接口(interface)中的自定义'T'。它在这里使用泛型,我想是“T”类型。那么类型'T'是在哪里定义的呢?

  public interface TemplateBuilder<T extends TemplateBuilder>  

最佳答案

T 不是实际的类。它是在编译时确定的,具体取决于您的类 TemplateBuilder 的使用情况。只需将其视为各种可能类型的占位符,其中一种是根据您的情况“选择”的。

一个更简单的例子,看下面(改编自 Java 的教程):

假设您要声明一个 Box 类,它可以采用特定类型(要在框中保存的对象),但您希望在各种情况下重用它来保存各种不同的类型。

因此,不是固定 Box 可以采用的实际类型,而是按如下方式声明它:

public class Box<T> {

    private T t; // T stands for "Type"          

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

    public T get() {
        return t;
    }
}

当你使用它时,你会做类似的事情:

Box<Integer> integerBox = new Box<Integer>();

您可能会问的重点是什么?为什么不让 Box 接受一个对象?

事实上,在 Java 1.5 之前这是不可能的。引入它是为了在这些情况下具有进一步的类型安全性,并在 Collections 框架中采用。

重点是,如果没有这种机制,如果它使用对象,则不能强制 Box 的特定实例仅包含整数。另一方面,如果您让它专门使用整数,则不能将您的 Box 重新用于 String 或其他对象,您将需要创建另一种类型的 Box 类。

在 Java 1.5 之前,像 ArrayList 这样的对象采用普通的对象,但是在运行时经常会出现类型安全被破坏的情况,因为程序假设一个 Integer 对象列表并且错误地在某处插入了一个 String。泛型(通过这个神奇的 T)强制类型而不限制它们可能是什么。

在您的例子中,T extends TemplateBuilder 更进一步并声明无论 T 是什么,它都必须是一个扩展 TemplateBuilder 的类。如果不存在,那么它可以是任何扩展 Object(Java 的通用基类)的类。

关于java - 自定义泛型解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4713756/

相关文章:

java - com.jcraft.jsch.ChannelSftp.get(String src,String dst) 会覆盖现有文件吗?

java - 实现接口(interface)的名称冲突

function - 具有多个调用签名的 TypeScript 接口(interface)

kotlin - 限制 Kotlin 中伴随对象的类型

php - Laravel 助手接口(interface)

java - 具有非 UTF-8 字符集的 JAR 文件

java - java字符串中的西类牙字符问题

java - 使用 Google Sheets API 插入行

c# - 表达式<Func<T, bool>> 方法参数

java - 真的需要通配符泛型吗?