我(从实际代码中简化):
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
之后,它不会抑制警告。有没有办法删除此警告?
答案 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一起使用。
所以,我认为你应该改变你的方法,因为这种模式匹配显然会成为一个问题。