instanceof会产生检测接口的不一致结果吗?

时间:2009-03-10 16:28:54

标签: java instanceof

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

期待您的评论:

1)我知道instanceof是不好的形式。我正在处理一个不能完美的对象层次结构,这是我能想到的最不好的事情。

2)我正在努力创建一个代码示例,但是如果我要在这里粘贴任何有用的东西,我需要大量简化我的代码。与此同时,如果你以前见过这个并且可以解决这个问题,请做。

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:9)

好的,问题解决了。像往常一样,这个问题比我想象的要少。我正在处理的项目处于一个不幸的状态,即有一些重复的类名。我正在使用foo.MyInterface创建类,并测试bar.MyInterface的实例。谢谢你的回复。它确实帮助我思考它。

答案 3 :(得分:5)

我所知道的唯一问题是null instanceof没有类型。

答案 4 :(得分:3)

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

如果你在期望为真时得到假,你可能正在尝试比较来自不同ClassLoader的实例。

答案 5 :(得分:-1)

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

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

对于实现接口的类,这将返回true。