我很困惑
我有一个直接实现接口的类:
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,我不确定为什么:
isAssignableFrom
log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));
从文档:
确定是否 类或 由这类对象表示接口是 任一相同,或是一个超类或 的超接口,类或接口表示由指定的类的参数。
我不应该总是能够将一个对象强制转换为其类实现的接口吗?
谢谢。
如果两个不同的类加载器加载名为的类,则会发生这种情况AutocompleteResult。
AutocompleteResult
即使这两个类具有相同的包和名称(甚至是实现/字段/方法),也将它们视为 完全不同的 类。
一个常见的原因是,如果您使用某种插件系统,并且您的基类和插件类都 提供 相同的类。
要检查是否存在此问题,请Class.getClassLoader()在两个有问题的类(即由实现的接口的类Device 和 的结果AutocompleteResult.class)上打印返回的值。
Class.getClassLoader()
Device
AutocompleteResult.class