[英]can't cast to implemented interface
我很困惑......
我有一個直接實現接口的類:
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));
來自文檔 :
確定 此Class對象 表示的類或接口是否與指定的Class參數表示的類或接口相同,或者是它們的超類或超接口。
我不應該總是能夠將對象強制轉換為其類實現的接口嗎?
謝謝。
如果兩個不同的類加載器加載名為AutocompleteResult
的類,則會發生這種情況。
然后將這兩個類視為完全不同的類,即使它們具有相同的包和名稱(甚至是實現/字段/方法)。
一個常見的原因是如果你使用某種插件系統,你的基類和插件類都提供相同的類。
要檢查此問題,請在兩個有問題的類(即Device
實現的接口類和 AutocompleteResult.class
的結果Class.getClassLoader()
上打印Class.getClassLoader()
返回的值。
當Java顯然不是Java時,AKA。
我最近使用Play Framework 2.6.3解決了這個問題,幫助我的是: https : //www.playframework.com/documentation/2.6.x/ThreadPools#Application-class-loader
我在這里留下這些信息給那些可能有同樣問題的人。
為了更清楚,有用的是:
在Eager Singleton上注入應用程序,然后使用其類加載器加載我遇到問題的類。
使它更清楚
public class Module {
@Override
public void configure {
bind(TheClassLoaderLoader.class).asEagerSingleton()
public static class TheClassLoaderLoader {
@Inject
public TheClassLoaderLoader( Application application) {
ClassLoader classloader = application.classloader();
Class<?> interfaceClass = classloader.loadClass(InterfaceClass.class.getName());
classloader.loadClass(ImplementsInterfaceClass.class.getName()).asSubclass(interfaceClass);
這里的例子https://playframework.com/documentation/2.6.x/JavaDependencyInjection#Configurable-bindings
使用Environment
通常會引發令人沮喪的ClassNotFoundException
干杯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.