12

有什么棘手的事情我应该知道instanceof吗?我通过一些方法传递了一个对象列表,并测试这些对象是否使用instanceof. 在某些情况下,instanceof正确地将对象识别为实现了接口,而在其他情况下则没有。它似乎给我在不同地方的同一个对象上不一致的结果。我应该在这里注意什么技巧/陷阱?

期待您的评论,您可能有:

1)我知道这instanceof是不好的形式。我正在使用一个无法更改的不太完美的对象层次结构,这是我能想到的最不坏的事情。

2)我正在创建一个代码示例,但如果我要在此处粘贴任何有用的内容,我需要大量简化我的代码。与此同时,如果你以前看过这个并且可以阐明一些问题,请这样做。

4

6 回答 6

14

您是否正在动态加载任何类型,可能来自不同的类加载器?我唯一一次看到明显不一致的结果是当我有两行代码看起来它们引用相同的类型,但实际上是从不同的类加载器加载了该类型。

于 2009-03-10T16:34:51.233 回答
9

好的,问题解决了。像往常一样,这个问题没有我想象的那么奇怪。我正在从事的项目不幸的是有一些重复的类名。我正在使用 foo.MyInterface 创建类并测试 bar.MyInterface 的实例。感谢您的回复。它确实帮助我想通了。

于 2009-03-10T17:00:15.650 回答
9

instanceof总是返回false. null如果左边的静态类型不可能是指定类型的实例,则它不会编译。除此之外,它应该毫无意外地工作。

与 C++(我相信 Smalltalk)不同,对象不能在运行时更改类型。在 C++ 中,类型在构造过程中发生变化,因此不能从构造函数调用方法到派生类 [子类] 方法。

于 2009-03-10T16:36:18.373 回答
5

我知道的唯一问题nullinstanceof没有类型。

于 2009-03-10T16:34:43.680 回答
3

只要您没有类加载问题,instanceof 就可以始终如一地工作。我猜你知道如果 A 是从 B 继承的,或者 A 实现的某些接口或 A 扩展的类是 instanceof B,则 A instanceof B 返回 true。

如果您在期望为 true 时得到 false,那么您可能正在尝试比较来自不同 ClassLoader 的实例。

于 2009-03-10T16:38:49.367 回答
-1

您可能想要“isAssignable”而不是 instanceof:

if (MyInterface.isAssignableFrom(myObject.getClass())) {
  //  do work here
}

这将为实现您的接口的类返回 true。

于 2009-03-10T16:35:34.413 回答