2015-10-04 98 views
2

我使用IntelliJ IDEA的Scala插件,并且发现该插件的奇怪行为。让我告诉你一个代码片段:IntelliJ IDEA:检测不能是相同类型的表达式的比较(==和!=)

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

你想,如果个数为int然后返回其他数字0? –

+0

是的,我想通过模式匹配来做到这一点。 – Finkelson

+0

根据我的经验,IntelliJ IDEA的“比较无关类型”警告是不可靠的。我在几个地方看到了这些警告是错误的。 –

回答

0

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

编辑:

您歌厅此错误的一些(x)是不一样的诠释。
但你正在状态这里指挥过的一些(x)的第一,然后直接检查实例是否为int的,所以他们基本上没有相同的类型(INT和一些)
case Some(x) if x.isInstanceOf[Int] => x.asInstanceOf[Int]

为了避免这种情况警告:
如果您想将其保存为Option [Any]作为输入,则可以执行此类操作。

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

否则,如果你知道的输入将是选项[INT]然后 用它作为参数。

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

好点!但我想用一个'Constructor Pattern'。我有一个怀疑,有一些解决方法,以使其正确。 – Finkelson

+0

@Finkelson:试试这个..'def fun:Option [Any] => Int = {0} => x.asInstanceOf [Int] case None => 0 }' –

+0

Yeap,the警告已经消失。 – Finkelson

0

我没有得到类似的警告,但很重要的东西,你应该知道的是,你的代码是不是“case语句”完整的,具有潜在的漏洞。例如,你应该传递一些(“字符串”),你的案例行都不能处理这个问题。潜在的修正:

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 
} 
+0

我增加了一个case'case Some(other)=> 0',但我仍然看到IDEA警告。 – Finkelson