小编典典

无法转换为已实现的接口

java

我很困惑

我有一个直接实现接口的类:

public class Device implements AutocompleteResult
{...}

这证明我在寻找正确的变量:

Object match = ...;
log.debug(match.getClass()); // Outputs 'Device'
log.debug(match.getClass().getInterfaces()[0]); // Outputs 'AutocompleteResult'

但是,当我尝试将类的实例强制转换为接口时:

AutocompleteResult result = (AutocompleteResult) match;

我收到ClassCastException!

ClassCastException: Device cannot be cast to AutocompleteResult

另外,isAssignableFrom返回false,我不确定为什么:

log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));

文档

确定是否 类或 由这类对象表示接口是 任一相同,或是一个超类或 的超接口,类或接口表示由指定的类的参数。

我不应该总是能够将一个对象强制转换为其类实现的接口吗?

谢谢。


阅读 216

收藏
2020-09-15

共1个答案

小编典典

如果两个不同的类加载器加载名为的类,则会发生这种情况AutocompleteResult

即使这两个类具有相同的包和名称(甚至是实现/字段/方法),也将它们视为 完全不同的 类。

一个常见的原因是,如果您使用某种插件系统,并且您的基类和插件类都 提供 相同的类。

要检查是否存在此问题,请Class.getClassLoader()在两个有问题的类(即由实现的接口的类Device
的结果AutocompleteResult.class)上打印返回的值。

2020-09-15