给出以下代码
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
答案 0 :(得分:1)
我可能误解了这个问题,但听起来好像你是在类型lambdas之后。
如果您在Google上搜索该字词,您会发现很多匹配,但this可能是最干净的解释。
<强>更新强>
在这种情况下,最简单的方法就是使用 type ascription 并告知编译器您将使用h
,就像它是{{1}的实例一样(这是有效的,因为逆变意味着String => String
是String=>String
的超类)。
然后你可以让其余的隐含机制无需进一步调整就可以了:
Any=>String
作为一个额外的好处,如果你这样做,代码的意图会更加清晰。