1

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

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 看起来BaseStreamJava8 中的类型声明是解决这个问题的一个很好的例子。我正在尝试使用这种方法。将在这里更新我的进度。

更新 2,当我有多个继承级别时,该BaseStream方法不起作用。请参阅多级层次​​结构中的 Java 继承的 Fluent 方法返回类型

4

1 回答 1

2

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

Liskov 替换原则指出对象可以被子类型替换而不改变任何属性,所以如果你正确地编码你的类,那么你就不需要强制转换,特别是如果你只是从super.

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

于 2013-10-08T19:48:32.183 回答