我很困惑...
我有一个直接实现接口的类:
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
Also, isAssignableFrom
返回 false,我不知道为什么:
log.debug(AutocompleteResult.class.isAssignableFrom(Device.class));
来自doc:
确定是否类或该类对象表示的接口是要么相同,要么是超类,或者由指定 Class 参数表示的类或接口的超接口。
难道我不应该总是能够将对象强制转换为其类实现的接口吗?
Thanks.
如果两个不同的类加载器加载名为的类,就会发生这种情况AutocompleteResult
.
这两个类被视为完全不同类,即使它们具有相同的包和名称(甚至实现/字段/方法)。
造成这种情况的一个常见原因是,如果您使用某种插件系统以及您的基类和插件类provide同一个班级。
要检查此问题,请打印返回的值Class.getClassLoader()在两个有问题的类上(即由Device
and的结果AutocompleteResult.class
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)