java - 改变java中子类方法的语义

标签 java inheritance sorting overriding overloading

我最近学习了大约 3 种新语言,但我开始对它们感到困惑。几年来我没有使用 Java 来做任何特别复杂的事情(在 android 之外)。我记不起这是否可能:

我将 ArrayList 子类化主要是为了让 arraylist 保持有序。我试图重写 add(object) 方法,但我希望它返回一个 int 而不是 boolean 值(添加的对象的位置)。但是我在方法的返回类型上遇到错误。

我想要的东西甚至可以用语言实现吗?能否让子类中的方法返回与父类(super class)方法不同的东西?

或者我想做一些愚蠢的事情?这是否打破了继承的 is-a 理念?我应该只封装一个数组列表而不是扩展它吗?

作为引用,我正在尝试做的一部分:


public class AuthorArray extends ArrayList \{

    @Override
    public int add(Author object) {
        super.add(object);

        Collections.sort(this, new SortByLastName());

        return this.indexOf(object);
    }
}

最佳答案

Can you have a method in a subclass return something different than the superclass' method?

一般来说,不会。唯一的异常(exception)是协变返回类型,当重写方法返回基类/接口(interface)方法中返回类型的子类时。这在 Java5 中成为可能,并且是一种很好的做法。但您的情况不属于此类。

Is this breaking the is-a idea of inheritance?

ArrayList 的用户希望从 add 中得到一个 boolean 返回值,并按照他们添加它们的相同顺序查看元素,您会中断那种期待。不要那样做。

Should I just encapsulation an arraylist instead of extending it?

是的。然后您可以使用您喜欢的任何契约(Contract)定义自己的接口(interface)。但首先,考虑使用 TreeSet相反

关于java - 改变java中子类方法的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800092/

相关文章:

c++ - 按值将子类对象传递给采用父类(super class)对象的函数是否是明确定义的行为?

javascript - 叠瓦式 javascript for 循环的简化

angular - 如何在 Typescript 或 Angular 中自定义排序 JSON 数组

python - 从数组中提取重复值和位置的列表

java - 在eclipse java web应用程序中引用特定资源的url

具有管理员权限的 java 运行可执行文件

java sql语法错误插入到

php - 如何对继承对象进行单元测试?

java - 使用 Jsoup 登录网站并停留在该网站上

Java 数组和继承