gpt4 book ai didi

java - 没有类型转换的Java编译器如何在子类中调用正确的equals()函数?

转载 作者:行者123 更新时间:2023-12-02 01:58:04 24 4
gpt4 key购买 nike

我有ScheduledSessionViewModel扩展类 AbstractSessionViewModel 。这两个函数都实现了equals()函数。

class AbstractSessionViewModel {
@Override public boolean equals(Object o) {
return /* some logic */
}
}

class ScheduledSessionViewModel extends AbstractSessionViewModel {
@Override public boolean equals(Object o) {
if (!super.equals(o)) return false;

return /* some logic */;
}
}

由于我使用的是 Android 新 ListAdapter我正在实现 DiffUtil.ItemCallback<T>我有下一个方法:

@Override public boolean areContentsTheSame(AbstractSessionViewModel oldItem, AbstractSessionViewModel newItem) {
if (oldItem instanceof ScheduledSessionViewModel && !(newItem instanceof ScheduledSessionViewModel)){
return false;
} else if (!(oldItem instanceof ScheduledSessionViewModel) && newItem instanceof ScheduledSessionViewModel){
return false;
} else if (oldItem instanceof ScheduledSessionViewModel){
return ((ScheduledSessionViewModel)oldItem).equals((ScheduledSessionViewModel)newItem);
} else {
return oldItem.equals(newItem);
}
}

这里奇怪的是编译器在下一个语句中向我显示警告

((ScheduledSessionViewModel)oldItem).equals((ScheduledSessionViewModel)newItem);

类型转换是不必要的

这怎么可能? Java 编译器如何检测到 oldItem类型为ScheduledSessionViewModel

最佳答案

How's Java compiler able to detect that oldItem is of type ScheduledSessionViewModel?

不,不是;编译器只知道 oldItem 的类型为 AbstractSessionViewModel

但这并不重要。编译器知道 AbstractSessionViewModel 具有 equals(Object) 方法,因此实际对象类型也具有该方法。通过这种方式,编译器保证 equals(Object) 方法在运行时可用。

如何实现只有在运行时才知道。运行时根据 JLS 定义的一组规则搜索适当的方法。

关于java - 没有类型转换的Java编译器如何在子类中调用正确的equals()函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52046779/

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