0

是否可以在下面的代码中做我想做的事情:

class Foo extends SomeClass
class Bar extends SomeClass
def f[A<:SomeClass,B<:SomeClass](a:A,b:B):B = b
val a = new Foo
val b = new Bar

scala> Map[String,(_<:SomeClass)=>(_<:SomeClass)]("key"->f(a,b))
<console>:15: error: type mismatch;
 found   : Bar
 required: Function2[_ <: SomeClass, _ <: SomeClass, _ <: SomeClass]
              Map[String,(_<:SomeClass,_<:SomeClass)=>(_<:SomeClass)]("key"->fun(a, b))
                                                                            ^
4

2 回答 2

1

有几个问题:

  1. f(a,b)是应用函数f,因此您将放置返回值,而不是函数本身。
  2. Scala 不支持一阶多态函数值(使用 Shapeless,如果你真的需要它们),所以首先尝试使用非泛型。
  3. 正如@GarrettHall 所说,您的地图类型错误。

建议的解决方案:

def f(a: SomeClass,b: SomeClass): SomeClass = b

Map[String, (SomeClass, SomeClass) => SomeClass](key -> (f _))

另请注意@om-nom-nom 的评论,key根据您的操作,模式匹配可能会更快。

于 2013-05-22T17:21:19.003 回答
0

你的签名Map是错误的。它应该是:

  Map[String,(_<:SomeClass, _<:SomeClass)=> (_<:SomeClass)]("key" -> f)
于 2013-05-22T17:08:45.037 回答