当前位置: 首页 > 面试题库 >

无法转换为已实现的接口

姬经义
2023-03-14
问题内容

我很困惑

我有一个直接实现接口的类:

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

从文档:

确定是否 类或 由这类对象表示接口是 任一相同,或是一个超类或 的超接口,类或接口表示由指定的类的参数。

我不应该总是能够将一个对象强制转换为其类实现的接口吗?

谢谢。


问题答案:

如果两个不同的类加载器加载名为的类,则会发生这种情况AutocompleteResult

即使这两个类具有相同的包和名称(甚至是实现/字段/方法),也将它们视为 完全不同的 类。

一个常见的原因是,如果您使用某种插件系统,并且您的基类和插件类都 提供 相同的类。

要检查是否存在此问题,请Class.getClassLoader()在两个有问题的类(即由实现的接口的类Device
的结果AutocompleteResult.class)上打印返回的值。



 类似资料:
  • 问题内容: 我正在编写一些代码,并且我需要它来捕获参数并将它们传递给 我(我想要它的默认行为,编写由空格分隔并后跟换行符的参数)。但是它需要而返回。 这是代码示例: 这将返回以下错误: 这是一个错误吗?不应该接受 任何 数组吗?顺便说一句,我也尝试这样做: 但出现以下错误: 有“解决方案”解决方法吗? 问题答案: 这不是错误。需要一个类型。这意味着它必须是值的切片,而不是“任何切片”。为了转换切片

  • 问题内容: 为什么写: 问题答案: 实现的对象是。 您要在其中覆盖的方法应将对象作为参数,而将其强制转换为。您的实现应描述如何与另一个进行比较。 要真正进行排序,您可能还需要制作工具,然后将实际逻辑复制粘贴到其中。

  • 问题内容: 我当前正在使用条件来检索用户的详细信息,但是当尝试用合适的用户查询详细信息对象时,我得到了ClassCastException。 我的标准代码; 我也尝试使用; 两者都给我ClassCastException。我知道我可以通过让用户实现Serializable来轻松解决它,但是还有其他解决方案吗? 问题答案: 唯一的其他解决方案是实现Externalizable。

  • 我用Javax发送邮件有问题。我们使用gmail大约4年了,用我们的Java软件发送邮件。现在我得到了以下错误: 以下是我的gmail设置: 我还尝试了其他邮件服务器(O365、Strato),但收到了相同的错误。

  • 问题内容: 我已经编写了一个通用类,下面是该类的构造函数。我想像这样写 由于我不知道运行时的泛型类型,因此它将引发异常。 有什么办法解决这些问题?E的声明是 这就是我要打电话的方式 更新 家伙,谢谢您的帮助。我在搞泛型,所以问题就被创建了。这是所有导致问题的代码- 更新2 :似乎除了传递下面的答案中提到的类类型外,我们无法做到这一点。 问题答案: 这是重现异常所需的最最少的代码。 Java泛型使用