【发布时间】:2026-01-22 07:00:01
【问题描述】:
我有一个通用特征SomeTrait 定义如下:
trait SomeTrait[T] {
def foo(t: T): String
}
和方法bar 和qux 一样:
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,但我认为它不适用。
【问题讨论】:
-
后一个例子也不能编译。
bar预期类型T,但 qux 基本上返回一个List[SomeTrait[Any]],这与它的类型T参数不匹配。 -
@YuvalItzchakov 如果您尝试
def qux: List[SomeTrait[Any]],它会正常工作,所以这不是问题。 -
@YuvalItzchakov 后者编译得很好。
-
@HTNW 你能发布完整的复制品吗?
-
@YuvalItzchakov From the REPL