假设我有一个类型族,我已经在基类型中定义了一组方法:
interface Foo<T> {
Foo<T> a();
Foo<T> b();
...
}
Bar
延伸Foo
interface Bar<T> extends Foo<T> {
Bar<T> a();
Bar<T> b();
...
}
然后Zee
延伸Bar
interface Zee<T> extends Bar<T> {
Zee<T> a();
Zee<T> b();
...
}
当我用不同的装饰器实现这个类型系列时,我发现我经常写类似
的东西class XBar<T> extends XFoo<T> implements Bar<T> {
Bar<T> a() {
return (Bar<T>)super.a();
}
Bar<T> b() {
return (Bar<T>)super.b();
}
...
}
真的很乏味。我想知道这是Java API设计中的正常情况,还是我做错了什么,或者有一种聪明的方法来解决使用一行代码的常量类型转换?
更新,要回答您的意见和回应,是的,方法链是我想在这里实现的一件事。 BTW看起来像Java8中的BaseStream
类型声明是解决此问题的一个很好的例子。我正在尝试使用这种方法。将在此处更新我的进度。
更新2 ,当我有多个继承级别时,BaseStream
方法不起作用。见Java inherited Fluent method return type in multiple level hierarchies
答案 0 :(得分:2)
为什么你的子类需要返回子类类型?
Liskov Substitution Principle表示对象可以被子类型替换而不改变任何属性,因此如果你正确地编写类,那么你不需要演员,特别是如果你只是从{{1}返回结果}。
当我需要在链接期间访问额外的子类方法时,我能想到的唯一一个问题是方法链(如super
模式)...但这应该是罕见的。