gpt4 book ai didi

scala - 无法调用接受并返回特征中自引用参数化类型对象的函数

转载 作者:行者123 更新时间:2023-12-01 13:00:07 25 4
gpt4 key购买 nike

有没有人解释为什么以下 foo() 调用是非法的并返回错误:

trait Foo[T<:Foo[_]] {

def foo(t: T): T

def test_foo(t1: T, t2: T): T = {
// produces error:
// type mismatch;
// found: t2.type (with underlying type T)
// required: _$1 where type _$1"
t1.foo(t2)
}

}

从人类的角度来看应该没问题,因为我们有一个接受类型 T 并返回类型 T 的函数。然后我们有两个类型 T 的对象 t1 和类型 T 的 t2。其中一个对象具有方法 .foo() 和另一个是所需的类型,因此调用应该成功。这种推理有什么问题?

最佳答案

好问题。当你写 T <: Foo[_]它转换为存在类型 T <: Foo[X] forSome {type X} . Scala 编译器引用 X 的实例作为_$1以避免与现有符号名称冲突。在您的示例中,t1t2有类型 T .当您调用 t1.foo你正在治疗 t1作为Foo[_$1] ,因此预期参数的类型应为 _$1 .相反,编译器找到了 t2与类型 T , 这不匹配。要解决此问题,您必须在 T 上放置一个更受约束的类型:

trait Foo[T <: Foo[T]] {
...

关于scala - 无法调用接受并返回特征中自引用参数化类型对象的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833053/

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