【问题标题】:instanceof Double/Object won't work :(instanceof Double/Object 不起作用:(
【发布时间】:2010-07-03 17:18:18
【问题描述】:

我遇到了 java 的 instanceof 的问题。这是给我带来麻烦的代码差距:

LinkedList<Double> currentSummary = summary.getFirst().getQuantiles();

...更多代码...

while (!currentSummary.isEmpty()){

        if (currentSummary.getFirst() instanceof Double){
            orderedSummary.add(new ComparableWrapper<Double, Float>(currentSummary.removeFirst(), currentEpsilon));
        }
}

所以,我的问题是,if 条件不会变为真。 currentSummary 中的那些元素要么是 null 要么是 Double 值。我试图拒绝null 的元素。起初我只是添加了它们,后来又遇到了NullPointerException,因为一些(但不是全部!)元素是nullcurrentSummary 的示例元素是例如[null, 0.09861866469135272, 10.137051035535745, 107.12083740100329, 371.4371264801424, 827.432799544501, 1206.251577083686]。

有人知道为什么instanceof 在这种情况下不起作用吗?我也试过currentSummary.getFirst() instanceof Object...

提前致谢!

【问题讨论】:

  • 不是直接的答案,但是由于您似乎没有从链接列表中删除 null 条目,所以在遇到的第一个 null 上不会无限循环吗?您能否确保 getQuantiles() 不会首先将 null 引用添加到您的列表中?
  • currentSummary.getFirst() instanceof Object 的行为是否不同?
  • 您也可以尝试currentSummary.getFirst().getClass() 来查看对象实际属于哪个类。
  • 不,它没有。但这根本不是问题。如果它为空,我只是忘记删除第一个元素。于是我陷入了无限循环……

标签: java instanceof


【解决方案1】:

我假设您想在每次迭代中删除第一个条目,以便遍历完整列表。但是,只有在 instanceof 条件为真时才删除该条目。因此,当遇到第一个空值时,循环似乎变得无限(除非您删除了部分代码,并且我们看不到完整的循环体)

【讨论】:

  • 好吧,在我这里绝对是暖和的。问题当然是无限循环-.-非常感谢:)
【解决方案2】:

是否有可能由于auto-boxing/unboxing,Double 对象被拆箱到原始double,因此它们不是Double 类的实例。

如果是这种情况,是否改为检查非空元素会更好?

【讨论】:

  • instanceof 测试既不会自动装箱,也不会自动拆箱。
【解决方案3】:

为什么不使用简单的空检查?

if (currentSummary.getFirst() != null){ ... }

【讨论】:

  • 我同意,但这并不能解释为什么 instanceof 会为非空值返回 false。
  • 起初这似乎不起作用。但你是对的,这样也行,而且看起来好多了;)谢谢
【解决方案4】:

可以通过使用原始类型(LinkedList 而不是LinkedList&lt;Double&gt;)将非Double 条目添加到您的LinkedList&lt;Double&gt;。这些元素将无法通过instanceof Double 测试。但这些条目将通过instanceof Object 测试。

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 2011-03-09
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多