Java Generics调用自习解释

时间:2015-04-27 05:15:06

标签: java spring generics

Dave Syer已在包中编写了以下类 public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>> extends SecurityConfigurerAdapter<ClientDetailsService, B> implements SecurityBuilder<ClientDetailsService> { }

sed -r 's/[^\/]+.([^]]+).*- ([^ ]+)[^[]+.([^a-z]+).*/\1 : \2 \3/' FileName

-r, --regexp-extended

          use extended regular expressions in the script.

我在理解这段代码时遇到了一些困难。任何人都可以在这里解释泛型的用法以及戴夫想要在这里实现的目标吗?

2 个答案:

答案 0 :(得分:4)

它被称为递归类型绑定。此处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>,则期望子类型的调用者可能必须强制转换。

答案 1 :(得分:2)

通过使用class MyClass<T extends MyClass<T>>,您可以访问任何子类&#39;键入一般类型。

这使您可以执行以下操作:

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");