问题描述
当然OOP的答案是,@H_502_1@A是@H_502_1@B。如果@H_502_1@A不是一个@H_502_1@B,@H_502_1@A则仅应@H_502_1@B使用@H_502_1@B的功能来构成自己。
大概@H_502_1@B也有一些通用的实现,它们利用了对通用类型的限制。
另一个用例是@H_502_1@B看起来像这样:
@H_502_1@abstract class B<T extends B<T>> { public T createCopy(T t); }
现在,子类可以实现,@H_502_1@createCopy并且客户端代码可以安全地使用它,而无需强制转换…例如
@H_502_1@class A extends B<A> { public A createCopy(A t) { return new A(t); //copy constructor } }
比较以上内容:
@H_502_1@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需要相同,那么有没有办法不重复它们?但是似乎没有更好的方法可以将派生类的类型传播给父类。