Java API设计: narrow return type in methods

标签 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 设计中的正常情况还是我做错了什么,或者有一种聪明的方法可以用一行代码解决常量类型转换?

更新,为了回答您的评论和回复,是的,方法链是我在这里想要实现的一件事。顺便说一句,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/

相关文章:

C#自定义数据类型!

types - Kotlin 具体化的类型参数不能用作函数体中的类型参数

c++ - 如何使用模板表达成员之间的约束?

java - 如何使用 REST API 发布 Yammer 民意调查?

c++ - 在C++中使用全局变量初始化

C++重载函数问题

python - Python 中重写 __get__ 的问题

java - 如何使 listFooter 不可点击

java - 意外的 JAXB 错误

java - 修复了保持数据正确组织而不重复的问题