Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java instanceof在检测接口时产生不一致的结果?_Java_Instanceof - Fatal编程技术网

Java instanceof在检测接口时产生不一致的结果?

Java instanceof在检测接口时产生不一致的结果?,java,instanceof,Java,Instanceof,关于的实例,有什么我应该知道的技巧吗?我正在通过一些方法传递一个对象列表,并使用instanceof测试这些对象是否实现了一个特定的接口。在某些情况下,instanceof正确地将对象标识为实现接口,在其他情况下则不正确。它似乎给了我在不同地方对同一对象不一致的结果。这里有什么我应该注意的技巧吗 预计您可能会有以下评论: 1) 我知道instanceof的格式不好。我使用的对象层次结构不够完美,无法更改,这是我能想到的最不坏的事情 2) 我正在努力创建一个代码示例,但是如果我要在这里粘贴任何有用

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

预计您可能会有以下评论:

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


2) 我正在努力创建一个代码示例,但是如果我要在这里粘贴任何有用的东西,我需要大大简化我的代码。同时,如果您以前看到过这一点,并且可以了解一些情况,请这样做。

我所知道的唯一问题是
null
无类型的实例。

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

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

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

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

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


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

< P>只要没有类加载问题,就始终保持工作的一致性。 我想您知道,如果A从B继承,或者A实现或扩展的某些接口或类是instanceof B,那么instanceof B返回true


如果在预期为true时得到false,则可能是在尝试比较来自不同类加载器的实例

好的,问题解决了。和往常一样,问题没有我想象的那么严重。我正在处理的项目不幸地遇到了一些重复的类名。我使用foo.MyInterface创建了这个类,并测试了bar.MyInterface的实例。谢谢你的回复。它确实帮助我想清楚了。

有没有可能得到一个代码示例?只是一个猜测,但简化代码以发布示例可能会暴露问题。instanceof是一个操作符,所以它应该总是一样的。是的,我的猜测是,如果我简化我的代码,以便粘贴到所有有帮助的人的代码中,我会发现错误,并且不需要:)为什么你说使用instanceof是不好的形式?与instanceof完全相同,但如果myObject为null,则会抛出NPE…最好使用MyInterface.class.isInstance(myObject)-这不会抛出NPE。如果您在编译时知道MyInterface,那么即使这样也毫无意义——不妨使用InstanceOffgosh,我不这么认为。当运行一个简单的junit测试用例时,会出现这种奇怪的情况。这给了我足够的信息来假设我做了一些愚蠢的事情,只是需要简化。谢谢。具有讽刺意味的是,我几乎在我的回答中包含了这种可能性,但由于某种原因最终没有。这将教会我-下次我将发布所有想法,无论多么愚蠢:)谢谢你回答自己的问题,这也是我愚蠢的错误!我在这里有一个不可思议的认识时刻。