2

暗黙の TypeTag パラメータを持つ反射関数があります。

def fromOptionFn[R: TypeTag](self: Int => Option[R]): Wrapper[R] = {
println(TypeTag[R])
...
}

不明な理由で機能しないもの (ジェネリック型パラメーターを検出するのに十分強力な Scala 型推論を作成する方法を参照してください):

> fromOptionFn2(v => Some(" + _))
> typeTag(Any)

Option[R] から R を推論したことが原因だと推測するので、少し改善します。

def fromOptionFn[R, Opt <: Option[R]: TypeTag](self: Int => Opt): Wrapper[R] = {
println(typeTag[Opt])
...
}

今回はさらに悪いことに、コンパイルさえしません。このエラーは、scala が型を分析するほどスマートではないことを明確に推測しています。

> fromOptionFn2(v => Some(" + _))
Error: inferred type arguments [Nothing,Option[String]] do not conform to method fromOptionFn's type parameter bounds [R,Opt <: Option[R]]

では、このコンパイルの問題を一時的に回避するにはどうすればよいでしょうか? (もちろん、Lightbend issue tracker で報告できますが、遅すぎます)

補遺: この問題自体は、ジェネリック型パラメーターを検出するのに十分なほど強力な Scala 型推論を行うには? 、修正されない可能性があります。私の場合、タイプ R または Option[R] の TypeTag を取得してもかまいません。

4

1 に答える 1