2014-02-05 56 views
1

我已(从实际的代码简化):在这种情况下,我可以抑制未经检查的警告吗?

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 =>在式图案TypeName.this.Def B [A => B]处于未选中状态,因为它被擦除消除

我试图放置@uncheckedFun(f)后,但这会产生一个错误;并在f之后,这并没有压制警告。有什么办法去除这个警告?

+0

更多代码。这是斯卡拉。可以编写少于30行的代码,编译并运行! :d。 – goroncy

回答

1

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

由于注释“可以申请定义或声明,类型,或表达式”第11章),你需要那些你注释的应用之一是语法正确。这两个最有可能的候选人似乎是一种类型或一种表达。然而,看着第8个模式匹配,似乎

Fun(f) 

即,你需要应用注释语句,两者都不是,因为它看起来像它对应于:

StableId '(' varid ')' 

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

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 

,我们想阻止图形匹配泛型类型为中等,但它确实工作有浮动。

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

+0

与我的实际代码不适用,我知道类型参数是'A => B'。 –

+0

这不是问题。问题是isFun()中的模式匹配。在那里,你传递一个'Def [_]',你不知道'_'是什么。那么,由于类型擦除,不可能做任何种类的运行时模式匹配通用。这就是为什么在我的例子中,即使我传递了一个'List [Float]'它被匹配为'List [Int]'。 – n1r3

相关问题