假设我有一个类型更高的类型,我尝试写这样的东西:
class Foo[T[U]](thing: T[U]) {
def someMethodThatUsesU(arg: U): U = ???
}
编译失败,因为编译器无法识别符号U
。怎么会?是否有另一种方法可以在不执行class Foo[U, T[U]]
之类的情况下编写此内容?
某些背景信息:这是问题的简化示例。最终,我想写这样的东西:
trait SomeTrait[T]
class SomeClass[T[U] <: SomeTrait[U]](arg: T[U]) {
def somethingWithU(arg: U): U = ???
}
答案 0 :(得分:3)
T[U]
是什么,那么 U
并不是一个更高级的类型。它&#39;只是一个普通的旧类型。如果您的类或方法仅通过某种类型的构造函数进行参数化,则可以使用更高级的类型,例如, Option
或List
。
class[T[U]](...)
无法编译,因为您尝试使用两个类型参数,但只声明T
。无法以这种方式声明两个类型参数。您唯一的好选择是声明T
为更高级别的,第二个类型参数U
可以独立变化:
class Foo[T[_], U](thing: T[U]) {
def someMethodThatUsesU(arg: U): U = ???
}
答案 1 :(得分:0)
我找到了一个适用于我的用例的解决方案。只需将该类型指定给类型成员并使用类型投影:
trait SomeTrait[T] {
type A = T
}
class SomeClass[T <: SomeTrait[_]] {
def someMethod(arg: T#A): T#A
}