如何只指定几种类型的多态方法

时间:2014-02-10 20:41:58

标签: scala

给出以下代码

def doAction[A:Reads, B:Writes](bizMethod: A => B) = …
def f = doAction(g)

在某些情况下,编译器无法推断出类型。例如,g输入参数不能转换为Reads,但我们将使用可读的子类实例调用该方法。所以我想修复第一个类型,让编译器确定第二个类型,def f = doAction[XXX, _](g)

[更新]为了更好地理解这个问题,我添加了代码来说明问题:

trait Sth[A]
implicit val StringSth = new Sth[String]{}
def doAction[A:Sth,B:Sth](f: A => B) = f

def g(i: String) = "Str" + i
val gg = doAction(g)

def h(a: Any) = a.toString
def hh = doAction(h) // doesn't compile, it's normal
def hh[String] = doAction[String, _](h) //doesn't compile

我想用hh

致电String

1 个答案:

答案 0 :(得分:1)

我可能误解了这个问题,但听起来好像你是在类型lambdas之后。

如果您在Google上搜索该字词,您会发现很多匹配,但this可能是最干净的解释。

<强>更新

在这种情况下,最简单的方法就是使用 type ascription 并告知编译器您将使用h,就像它是{{1}的实例一样(这是有效的,因为逆变意味着String => StringString=>String的超类)。

然后你可以让其余的隐含机制无需进一步调整就可以了:

Any=>String

作为一个额外的好处,如果你这样做,代码的意图会更加清晰。