当前位置: 首页 > 知识库问答 >
问题:

具有不同返回类型但功能相同的命名方法

邵骁
2023-03-14

我说的是Java,但这个概念也适用于其他语言--

我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。

我们知道你不能这样做(因为它不会编译):

Iterable getThings()

Collection getThings() 

那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法:

Iterable getIterableOfThings

Collection getCollectionOfThings

然而,这显然有些冗长,可能不是最好的解决方案。我问的这个问题是否意味着我们的组织/编码方法在某种程度上偏离了标准,或者这是一个有效的问题?

还有其他人处理过这种情况吗?

共有3个答案

阳念
2023-03-14

Iterable getThings()似乎不正确,因为您实际上没有得到任何东西。Iterable提供迭代一组项目的访问权限,但不会为您提供这些项目。

集合将为您提供这些项目,因此Collection getThings()似乎是正确的。

例如,可以为无限长的集合提供一个迭代器,但不能提供这样的等价集合。这将起作用,因为迭代器将在某个时间返回一个元素,但集合需要收集无限多的对象并返回它们。

澹台权
2023-03-14

Iterable是集合的超级界面。一般来说,你不需要这样做。

尽管如此,这个问题本身是有效的。一个更好的例子是,比如说,你有一个底层资源,一个函数将它包装在一个访问对象中,第二个包装在另一个访问对象中。当然,这取决于编码风格,但就我个人而言,我习惯于看到这样的东西(因此发现它更具可读性):

class A {
    private Object[] underlying;
    List<Object> getItemsAsList() {
        return Arrays.asList(underlying);
    }
    Object[] getItemsAsArray() {
        return underlying;
    }
}
蒲魁
2023-03-14

怎么样:

Iterable getIterator();
Collection getThings();
 类似资料:
  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方

  • 我可以看到它不工作,因为我尝试了它。我只是无法解释为什么一定要这样。 第二个方法来自一个类,该类是实现第一个getValue()方法的类的子类。 为什么同名不足以覆盖该方法?我想到的唯一论点是,它将反对“是一个”关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,如果你重写返回类型,你就打破了那个法律,对吧?

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会