假设我有一个类型族,我在基本类型中定义了一组方法:
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 设计中的正常情况还是我做错了什么,或者有一种聪明的方法可以用一行代码解决常量类型转换?
更新,为了回答您的评论和回复,是的,方法链是我在这里想要实现的一件事。顺便说一句,Java8 中的 BaseStream 类型声明似乎是解决这个问题的一个很好的例子。我正在尝试使用这种方法。将在这里更新我的进度。
更新 2,当我有多个继承级别时,BaseStream
方法不起作用。请参阅Java inherited Fluent method return type in multiple level hierarchies
最佳答案
为什么你的子类需要返回子类类型?
Liskov Substitution Principle指出对象可以被子类型替换而不改变任何属性,因此如果您正确编码类,那么您不需要强制转换,特别是如果您只是从 super
返回结果。
我能想到的唯一一次出现此问题的情况是方法链接(例如 builder
模式),当您需要在链接期间访问额外的子类方法时......但这应该很少见。
关于Java API设计: narrow return type in methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256811/