IntelliJ IDEA:检测不能为同一类型的表达式的比较(==和!=)

时间:2015-10-04 16:25:40

标签: scala intellij-idea

我为IntelliJ IDEA使用Scala插件,我发现了该插件的奇怪行为。让我给你看一个代码片段:

def fun: Option[Any] => Int = {
  case Some(x) if x.isInstanceOf[Int] => x.asInstanceOf[Int]
  case None => 0
}

关于Scala代码,IDEA给了我一个警告:

Comparing unrelated types
Detects comparisons (== and !=) of expressions which cannot be the same type

并突出显示下一个语句x.isInstanceOf[Int]。我只使用isInstanceOf运算符来确定x的类型。这是插件的错误还是我在Scala语法中遗漏了什么?

2 个答案:

答案 0 :(得分:1)

使用getOrElse(0)进行此操作。

编辑:

您正在解决此错误,因为某些(x)与Int不同。
但是你在这里直接调整条件为某些(x)然后直接检查实例是否为Int,所以它们基本上不是同一类型(Int和Some)
case Some(x) if x.isInstanceOf[Int] => x.asInstanceOf[Int]

要避免此警告:
如果你想把它作为选项[任意]保留为输入,你可以这样做。

def fun(x:Option[Any]):Int = x match {
    case x:Some[Int] => x.get
    case x => 0
}

否则,如果你知道输入将是Option [Int]那么 用它作为参数。

def fun(x:Option[Int]):Int = x match {
    case x:Some[Int] => x.get
    case None => 0
}

答案 1 :(得分:0)

我没有得到类似的警告,但是你应该注意的一件非常重要的事情是你的代码不是“案例陈述”完整且有潜在的漏洞。如果你传给它Some(“String”),例如,你的案例行都不能处理它。可能的修复:

def fun: Option[Any] => Int = {
  case Some(x)  => if (x.isInstanceOf[Int]) x.asInstanceOf[Int] else 0 
  case None => 0
}

def fun: Option[Any] => Int = {
  case Some(x) if x.isInstanceOf[Int] => x.asInstanceOf[Int]
  case Some(other) => 0
  case None => 0
}