请解释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/