java中改变子类方法的继承语义
我最近学了三门新语言,我开始把它们弄糊涂了。我已经有几年没有用Java做过任何特别复杂的事情了(除了安卓)。我记不清这是否可能:
我正在对ArrayList进行子类化,主要是为了让ArrayList保持有序。我试图重写add(object)
方法,但我希望它返回一个int而不是布尔值(添加的对象的位置)。但是我的方法的返回类型出现了错误
我想要的在语言中是可能的吗?子类中的方法能否返回与超类的方法不同的结果
还是我想做些蠢事?这是否打破了继承的观念?我应该封装arraylist而不是扩展它吗
作为参考,我想做的一部分:
public class AuthorArray extends ArrayList \{
@Override
public int add(Author object) {
super.add(object);
Collections.sort(this, new SortByLastName());
return this.indexOf(object);
}
}
# 1 楼答案
改变语义是不好的。在您的情况下,如果您想要一个简单的解决方案,将方法名从
add
更改为myadd
可以解决您的问题就我个人而言,我建议学习如何使用Google guava-libraries不可变的、带有“函数”的排序数据结构,以便获得更新的概述,浏览youtube
但在标准Java中,我举了一个例子,说明如何使用TreeSet autosort——定制类、2值比较器和高效的二进制搜索等价物
这将输出:
# 2 楼答案
List接口保证元素将按照添加顺序返回。因此,如果只有一个线程操作列表,那么可以轻松地执行添加,然后请求其大小。size-1是元素的序数值
如果上面的顺序不是你想要的,那么你有两个选择——要么使用集合对列表进行排序。sort()方法,或使用SortedSet。这两种方法都可以使用比较器
我从未发现有必要扩展Java集合框架,也不建议您在这种情况下这样做
# 3 楼答案
通常不会。唯一的例外是协变返回类型,当被重写的方法在基类/接口方法中返回返回类型的子类时。这在Java5中成为可能,这是一个很好的实践。但你的案子不属于这一类
是。
ArrayList
的用户希望从add
中获得一个boolean
返回值,并按照他们添加元素的相同顺序查看这些元素,你会打破这种期望。不要那样做对。然后你可以用你喜欢的任何合同定义你自己的接口。但是首先,考虑使用^{} 代替