问题描述
当然OOP的答案是,A
是B
。如果A
不是一个B
,A
则仅应B
使用B
的功能来构成自己。
大概B
也有一些通用的实现,它们利用了对通用类型的限制。
另一个用例是B
看起来像这样:
abstract class B<T extends B<T>> {
public T createCopy(T t);
}
现在,子类可以实现,createCopy
并且客户端代码可以安全地使用它,而无需强制转换…例如
class A extends B<A> {
public A createCopy(A t) {
return new A(t); //copy constructor
}
}
比较以上内容:
abstract class B {
public B createCopy(B t);
}
class A extends B {
public B createCopy(B t) { //Is the copy an A or a different subtype of B? We don't know.
return new A(t); //copy constructor
}
}
解决方法
我在某处看到了这种模式:
class A extends B<A> {
}
通过将新类型指定为泛型的实际类型来扩展泛型,此结构有点不寻常。有什么用?此模式有名称吗?有其他替代方式吗?
示例:https://code.google.com/p/selenium/wiki/LoadableComponent
跳到: public class EditIssue extends LoadableComponent<EditIssue> {
编辑:阅读响应后,似乎我需要改变编译器对类型检查的理解。在我的脑海中,我有这种模式的牛肉是,如果两个A需要相同,那么有没有办法不重复它们?但是似乎没有更好的方法可以将派生类的类型传播给父类。