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

标签 java android inheritance equals

我有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/

相关文章:

java - Informix 上的 JPA 事务

android - 如何在android 2.2中播放shoutcast流

c# - 我什么时候需要在 C# 中调用 base()?

ruby-on-rails - 将继承的对象保存到 Mongoid 中的单独集合中

java - 更新时将数据发送到另一台服务器

Java:覆盖或重载方法?

java - Spring Security 初始化在 mvcContentNegotiationManager 上抛出 UnsatisfiedDependencyException

java - Proguard 返回错误代码 127。请参阅控制台

android - 发布调试并发布到 artifactory

c++ - 专注于 C++ 中的两个祖先类