gpt4 book ai didi

Java API设计: narrow return type in methods

转载 作者:行者123 更新时间:2023-11-30 04:12:40 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com