【问题标题】:ClassCastException: Class implementing the interface, still getting classcastClassCastException:实现接口的类,仍然得到类转换
【发布时间】:2015-04-23 23:23:26
【问题描述】:

我有一个使用泛型实现接口的类。

class MainClass {
    interface MyInterface <T extends MyInterface.A> {
        static class A {
        }
    }
}

//I have another class which implements this interface:
class ImplementingClass implements MyInterface<A> {
}

//I am loading MyInterface class from a jar in a different place: 
static loadJar(){
    String dexPath = new ContextWrapper(context).getCacheDir().getAbsolutePath();
    DexClassLoader classLoader = new DexClassLoader(JAR_FILE, dexPath, null, ClassLoader.getSystemClassLoader());
    Class c = classLoader.loadClass("ImplementingClass");
    MyInterface nvQS = (MyInterface) c.newInstance();
}

我得到一个类转换异常。我不确定这是为什么?该类正在实现接口。我也尝试过使用泛型,但仍然遇到异常。

如果我不清楚,请告诉我。谢谢。

包括例外: java.lang.ClassCastException:ImplementingClass 无法转换为 MainClass$MyInterface

嘿,接口是在android中构建为java静态库的。 jar 和 jar 加载器将针对单独的副本进行编译,对吗?那是问题吗?你认为这就是为什么我可能会得到一个班级演员吗?

【问题讨论】:

  • 您遇到的异常是什么?您尚未提供堆栈跟踪。通常,异常中的错误消息会相当明确地告诉您问题所在。
  • 你使用IDE吗?我建议您使用调试来查看对象“c”。看看它的类。
  • 是的,我做到了。 "加载类的名称:ImplementingClass"
  • 如果你在外部 jar 文件中有 MyInterface,你怎么可能编译 MyInterface nvQS = (MyInterface) c.newInstance(); ?这意味着您的项目中有一个 MyInterface,外部 jar 文件中有一个 MyInterface,因此即使它们具有完全相同的签名,也会有两个不同的类。

标签: java android classcastexception


【解决方案1】:

您正在创建一个与MyInterface 不同的新接口MainClass.MyInterface。如果您实现 MainClass.MyInterface 并转换为 MainClass.MyInterface 那么它应该可以工作。选择更好的名称可能可以避免这种情况。

不要与包混淆,如果包含MainClass,则可以跳过它们。

【讨论】:

  • 导入时我包含类名。那么在使用时我可以直接使用接口名称吗?也许这不是问题?也为名字道歉。我以为我让它变得简单。下次我会保留原来的名字。谢谢。
  • @user2248720 据我所知,如果您在另一个类中有接口,则不能这样做。然后你需要编写包含前面接口的类。可以跳过包。也许这取决于java版本。
  • 那也应该给我一个编译器错误吧?它编译得很好。我正在使用 Java 版本 7
  • @user2248720 不,如果两者都存在,则不会。试试看吧。
  • 嘿,我试过了。我仍然收到错误消息。 :(
【解决方案2】:

所以问题在于接口是一个静态库。因此,由于jar和加载它的代码是分开编译的,因此它们不会被java视为同一个类。我把它做成了一个共享库,它工作正常,也不例外。 :-)

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2014-10-05
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多