在 Scala 中,如何规避'inferred type arguments do not conform'错误?



我有一个带有隐式TypeTag参数的反射函数:

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

由于未知原因不起作用(请参阅如何使 Scala 类型推断足够强大以发现泛型类型参数?

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

我推测它是由从选项[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问题跟踪器上报告它,但它太慢了)

ADDENDUM:这个问题本身就是试图规避如何使Scala类型推断强大到足以发现泛型类型参数?,这可能不会被修复。就我而言,我不介意获取类型R或Option[R]的TypeTag,无论哪种工作都有效。

这不是一个改进,恰恰相反,Scala 类型推断根本不支持首先推断Opt并从那里获取R:相反,它推断NothingR因为它不是任何参数类型的一部分(返回类型未知)。

您可以通过在每次调用时显式指定类型参数来规避它:fromOptionFn2[String, Option[String]](...).我认为,在这种特定情况下,给出预期的类型也应该有效:fromOptionFn2(...): Wrapper[String].但是,更好的主意是首先不要使用像[R, Opt <: Option[R]]这样的类型参数签名。

相关内容

  • 没有找到相关文章

最新更新