Som*_*Guy 1 java generics interface java-ee
请在java界面中解释自定义'T'.它在这里使用泛型,我想是'T'类型.然后在哪里定义'T'类型?
public interface TemplateBuilder<T extends TemplateBuilder>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当您使用它时,您可以执行以下操作:
Box<Integer> integerBox = new Box<Integer>();
Run Code Online (Sandbox Code Playgroud)
您可能要问的重点是什么?为什么不让Box拿一个对象?
事实上,在Java 1.5之前,这是不可能的.这被引入以在这些情况下具有进一步的类型安全性,并且在集合框架中被采用.
重点是没有这种机制,如果它使用了Object,你就不能强制你Box的特定实例只保存整数.另一方面,如果你使用特定的Integers,你不能重复使用Box for String或其他对象,你需要创建另一种类型的Box类.
在Java 1.5之前,像ArrayList这样的对象使用了普通的对象,但是在运行时经常出现类型安全性破坏的情况,因为程序假设是一个Integer对象列表,而在某处插入了一个String.泛型(通过这个神奇的T)强制类型而不限制它们可能是什么.
在你的情况下,T extends TemplateBuilder更进一步,并说明无论T是什么,它必须是一个扩展TemplateBuilder的类.如果那不存在,那么任何扩展Object的类(Java的通用基类).
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |