gpt4 book ai didi

scala - 为什么Scala不会将此类型Lambda与基础类型统一?

转载 作者:行者123 更新时间:2023-12-04 13:46:39 24 4
gpt4 key购买 nike

trait A {
type T
def test(t: T): Unit
}

case class B[S <: A](a: S, t : S#T) {
def test() = a.test(t) // Error: type mismatch;
// found : B.this.t.type (with underlying type S#T)
// required: B.this.a.T
}

我期望上述内容编译是否错误?我的代码可以固定吗?

最佳答案

编译器没有足够的证据表明S#T可以在具体实例中用作test的参数。

考虑这个弱化scala编译器的过分示例

trait A2 extends A{
type T <: AnyRef
}

class A3 extends A2{
override type T = Integer

def test(t: Integer): Unit = println(t * 2)
}

因此, B[A2]应该接受 A3的实例以及 <: AnyRef的所有内容,而 A3恰好需要 Integer才能实现自己的 test实现

您可以在 B的定义中捕获具体类型,以确保将使用哪种类型
case class B[S <: A, ST](a: S {type T = ST}, t: ST) {
def test() = a.test(t)
}

关于scala - 为什么Scala不会将此类型Lambda与基础类型统一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com