Java API设计:方法中的窄返回类型

时间:2013-10-08 19:40:32

标签: java inheritance types casting api-design

假设我有一个类型族,我已经在基类型中定义了一组方法:

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

1 个答案:

答案 0 :(得分:2)

为什么你的子类需要返回子类类型?

Liskov Substitution Principle表示对象可以被子类型替换而不改变任何属性,因此如果你正确地编写类,那么你不需要演员,特别是如果你只是从{{1}返回结果}。

当我需要在链接期间访问额外的子类方法时,我能想到的唯一一个问题是方法链(如super模式)...但这应该是罕见的。

相关问题