【发布时间】:2013-10-08 19:40:32
【问题描述】:
假设我有一个类型族,我在基类型中定义了一组方法:
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 设计中的正常情况还是我做错了什么,或者有一种聪明的方法可以用一行代码解决常量类型转换?
更新,回答您的 cmets 和响应,是的,方法链是我想在这里实现的一件事。顺便说一句,Java8 中的 BaseStream 类型声明似乎是解决此问题的一个很好的例子。我正在尝试使用这种方法。将在这里更新我的进度。
更新 2,当我有多个继承级别时,BaseStream 方法不起作用。见Java inherited Fluent method return type in multiple level hierarchies
【问题讨论】:
-
你没有描述
XFoo<T>,这没有帮助。如果您能以完整的方式证明问题,那就太好了——您只需要一个方法,我怀疑您也不需要Zee。 -
我建议您将
Bar<T>和Zee<T>中的方法一起删除,并让他们使用Foo<T>中的方法。您当然可以从返回类型为Foo<T>的方法返回Bar<T>。如果这有什么问题,那么您可能需要多解释一下这些接口和类应该做什么。 -
在下面查看我的 cmets 以回答 #1
标签: java inheritance types casting api-design