如何解决相同类型归属在变量声明上丢失类型成员信息,但在方法参数声明上不丢失
考虑路径依赖类型
trait Foo[In] {
type Out
def f(v: In): Out
}
implicit val preciseFooInt: Foo[Int] { type Out = String } = new Foo[Int] {
type Out = String
def f(v: Int): String = v.toString
}
我们看到输出类型 Out
声明为类型成员。还要注意 preciseFooInt
实例的精确声明类型
Foo[Int] { type Out = String }
现在让我们通过强制赋值给它的超类型来失去类型成员的精度
val ev: Foo[Int] = preciseFooInt
因为我们省略了类型细化 { type Out = String }
,编译器不知道输出类型正是 String
,这很有意义
scala> val ev: Foo[Int] = preciseFooInt
val ev: Foo[Int] = $anon$1@2fd641f6
scala> val s: String = ev.f(42)
^
error: type mismatch;
found : ev.Out
required: String
但是让我们做非常相似的动作,但是通过方法参数声明
def g(ev: Foo[Int]) = ev.f(42)
注意方法参数 ev
如何与之前的变量 ev
具有完全相同的类型归属,即 Foo[Int]
没有特定类型成员细化 { type Out = String }
。尽管如此,现在类型成员精度没有损失
scala> def g(ev: Foo[Int]) = ev.f(42)
def g(ev: Foo[Int]): ev.Out
scala> val s: String = g(ev = preciseFooInt)
val s: String = 42
关于类型成员的变量声明和方法参数声明有什么区别?鉴于两种情况下的类型归属相同,为什么方法参数情况下没有信息丢失?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。