簡體   English   中英

無法強制轉換為已實現的界面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM