我为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语法中遗漏了什么?
答案 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
}