Custom Generics解释

Som*_*Guy 1 java generics interface java-ee

请在java界面中解释自定义'T'.它在这里使用泛型,我想是'T'类型.然后在哪里定义'T'类型?

  public interface TemplateBuilder<T extends TemplateBuilder>  
Run Code Online (Sandbox Code Playgroud)

jbx*_*jbx 8

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的通用基类).