scala - 如何从投影类型推断正确的类型参数?

标签 scala polymorphism type-inference type-projection

我在让 Scala 从类型投影中推断出正确的类型时遇到了一些麻烦。

考虑以下:

trait Foo {
  type X
}

trait Bar extends Foo {
  type X = String
}

def baz[F <: Foo](x: F#X): Unit = ???

然后以下编译正常:
val x: Foo#X = ???    
baz(x)

但以下不会编译:
val x: Bar#X = ???    
baz(x)

Scala 看到 x 的“底层类型字符串” ,但是丢失了x的信息是 Bar#X .如果我注释类型它工作正常:
baz[Bar](x)

有没有办法让 Scala 为 baz 推断正确的类型参数?
如果不是,那么使之成为不可能的一般答案是什么?

最佳答案

程序通过在上下文中添加这个隐式转换来编译:

implicit def f(x: Bar#X): Foo#X = x

由于此隐式转换适用于任何 F <: Foo ,我想知道为什么编译器自己不这样做。

关于scala - 如何从投影类型推断正确的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721127/

相关文章:

python - Python 中内置类型的多态性

python - 为什么python不能像scala那样推断类型?

scala - 给定任何类类型的实例,如何找出它继承或实现的父类和/或特征?

json - 在 Play Framework 2.0 Scala 中处理 JSON 请求

java - Java中如何正确使用多态调用正确类的方法

c++ - 复制多态对象

java - java API 的 Scala 包装器 API

案例类列表中的Scalatest Double等价

Scala 案例类副本并不总是适用于 `_` 存在类型

scala - 如何在 Scala 中为表达式注释表达式类型