Java 泛型调用自我类解释



Dave Syer在包中写了以下类,org.springframework.security.oauth2.config.annotation.builders

    public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>> extends
        SecurityConfigurerAdapter<ClientDetailsService, B> implements SecurityBuilder<ClientDetailsService> {
}

我在理解这段代码时遇到了一些困难。谁能解释一下这里泛型的用法以及戴夫在这里试图实现的目标?

它被称为递归类型绑定。这里B是根据ClientDetailsServiceBuilder来定义的。但由于这是刚刚声明的类型,因此再次出现B以满足类型参数。

我发现有用的更一般的解释:http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ106

此模式的另一个很好的例子:

public interface Tree<T extends Tree<T>> {
    List<T> getChildren();
}

此定义使Tree的子类型(实现)自动返回其类型参数的子项,该参数必须是Tree,甚至可以是它们的实际类型。如果返回类型只是List<Tree>,则期望子类型的调用者可能必须强制转换。

通过使用class MyClass<T extends MyClass<T>>,您可以访问任何子类的类型作为泛型类型。

这使您能够执行以下操作:

class MyClass<T extends MyClass<T>> {
    private int value;
    T withValue(int value) {
        this.value = value;
        return (T) this;
    }
}
class MySubclass extends MyClass<MySubclass> {
    private String name;
    public MySubclass withName(String name) {
        this.name = name;
        return this;
    }
}
MySubclass s = new MySubclass()
    .withValue(5)
    .withName("John Doe");

最新更新