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.
我在理解这段代码时遇到了一些困难。任何人都可以在这里解释泛型的用法以及戴夫想要在这里实现的目标吗?
答案 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");