首頁>Program>source

我很困惑...

我有一个直接實現介面的類:

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));

来自doc

Determines if the 類或 interface represented by this Class object is 与超類或 superinterface of, the class or interface represented by the specified Class parameter.相同或

我是否总是能够將物件強製轉換為其類實現的介面?

谢谢。

最新回復
  • 7月前
    1 #

    如果两个不同的類載入器載入了一个名為 AutocompleteResult的類,則可能会發生這種情况。

    然後,即使這两个類具有相同的程式包和名稱(甚至是實現/欄位/方法),也將它们视為完全不同的類。

    一个常见的原因是,如果您使用某種插件系統,並且您的基類和插件類都提供相同的類。

    要檢查此問题,請print Class.getClassLoader()返迴的值 在两个有問题的類上(即由 Device實現的介面的類 AutocompleteResult.class的結果 )。

  • 7月前
    2 #

    又稱Java,顯然不是Java。

    我最近在Play Framework 2.6.3中遇到了這个問题,這對我有所帮助: https://www.playframework.com/documentation/2.6.x/ThreadPools#Application-class-loader

    我將這些資訊留给可能有相同問题的人使用。

    更清楚地說,有什麼帮助:

    在急切的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

    欢呼

  • iOS AES Encryption:iOS AES加密-加密失败
  • matlab:對齐已捕获的RGB和深度圖像