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