我很困惑
我有一个直接实现接口的类:
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泛型使用