findViewById 中出现奇怪的 ClassCastException

Strange ClassCastException in findViewById

我观察到在线抛出一个奇怪的异常:

viewPager = (ViewPager) view.findViewById(R.id.pager);

异常如下所示:

java.lang.ClassCastException: android.support.v4.view.ViewPager cannot be cast to android.support.v4.view.ViewPager

我无法重现,但根据日志有时会发生。

该应用使用 gradle 的官方 multidex 构建。

根据 JLS,当您尝试将一个 class 转换为另一个 class 时会发生 ClassCastException,这是很明显的。

不太明显的是Class身份的定义:

  1. classes 必须是 class、接口或数组类型,
  2. 它们必须具有相同的二进制名称,
  3. 它们必须由相同的有效加载 ClassLoader

在您的情况下,多个 ClassLoader 很可能会加载相同的 class。