在这种情况下,我可以取消未经检查的警告吗?

时间:2014-02-05 14:48:29

标签: scala generics compiler-warnings

我(从实际代码中简化):

class Def[T]

object Fun {
  def unapply[A,B](d: Def[A => B]): Option[A => B] = ???
}

def isFun(d: Def[_]) = d match {
  case Fun(f) => true
  case _ => false
}

这会产生警告:

  

非变量类型参数A => B类型模式TypeName.this.Def [A => B]未经检查,因为它被删除删除

我尝试在@unchecked之后放置Fun(f),但这会产生错误;在f之后,它不会抑制警告。有没有办法删除此警告?

2 个答案:

答案 0 :(得分:1)

我希望我错了,但在浏览SLS之后,我不相信您可以在正确的位置应用注释而不更改您的代码

由于注释“可能适用于定义或声明,类型或表达式”第11章),因此您需要其中一个注释应用程序在语法上正确。这里最有可能的两个候选人似乎是一个类型或一个表达。但是,看看第8章模式匹配,似乎

 Fun(f)

即。您需要应用注释的语句既不是,因为它看起来像是对应于:

 StableId '(' varid ')'

其中任何一个似乎都不适合表达式或类型(或任何其他有效的注释目标)。

答案 1 :(得分:0)

首先,您可以将def isFun(d: Def[_])的签名更改为def isFun[A,B](d: Def[A=>B])吗?

如果没有,问题是类型擦除。在JVM上,您不能拥有此代码:

trait Foo {
  def doStuff(xs:List[Int])
  def doStuff(xs:List[Long])
}

在运行时,您没有泛型的信息,它们的类型被删除。

因此,在您的情况下,问题是您无法与通用模式匹配。

让我们在Scala工作表中看到这个例子:

object Fun {
    def unapply[A, B](xs: List[Int]): Option[Int] = Some(1)
}

def isFun(d: List[_]) = d match {
    case Fun(f) => true
    case _ => false
} 
//> isFun: (d: List[_])Boolean

isFun(List(1.3)) 
//> res0: Boolean = true

我们想要模式匹配的泛型类型是Int,但它确实与Float一起使用。

所以,我认为你应该改变你的方法,因为这种模式匹配显然会成为一个问题。