gpt4 book ai didi

scala - 存在类型的类型推断

转载 作者:行者123 更新时间:2023-12-04 02:10:51 27 4
gpt4 key购买 nike

我有一个通用特征 SomeTrait 定义如下:

trait SomeTrait[T] {
def foo(t: T): String
}

方法 barqux 如下:

def bar[T](t: SomeTrait[T]): T
def qux: List[SomeTrait[_]]

我无法控制以上内容。我正在尝试对 qux 返回的列表进行操作,就像这样

qux map { x => x.foo(bar(x))}

但是,编译器提示类型不匹配。据我所知,这应该没问题。

我已经尝试添加一个通用方法(签名 [T](SomeTrait[T])String),并调用它来完成工作,但编译器仍然报错。我可以像这样绕过它:

qux map { x =>
val casted = x.asInstanceOf[SomeTrait[T forSome { type T }]] // !!!
casted.foo(bar(casted))
}

但这更令人困惑,因为 x 已经有类型 SomeTrait[_]SomeTrait[T forSome { type T }] 意思是一样的。我知道的唯一区别是前者是后者的简写,它使编译器创建自己的合成名称。我希望有更好的方法来做到这一点。我看过this question但是我认为它不适用。

最佳答案

正确的做法是使用一个类型变量给T一个名字:

qux map { case x: SomeTrait[t] => x.foo(bar(x)) }

这样编译器就知道 bar(x): t 并且它是 x.foo 的一个可接受的参数。

或者,您可以将 foobar 合并到一个方法中(记住方法可以是局部的,因此您可以在需要的地方定义它):

def fooOfBar[T](x: SomeTrait[T]) = x.foo(bar(x))
qux map { fooOfBar(_) }

关于scala - 存在类型的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38627415/

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