Scala 参数化类型界限
我有以下特点(简化示例)Scala 参数化类型界限,scala,types,Scala,Types,我有以下特点(简化示例) trait F[A,M[]M[A] } 我希望能够创造以下特质 trait G[A]扩展了F[A,Some] 但这会产生以下错误 错误:(18,20)类型参数[A,Some]不符合trait F的类型参数边界[A,M[u1;]F(A)。获取 } } 在这种情况下,在f2中,get不会返回a类型的值,即使f返回aM[a] Error:(17, 20) type mismatch; found : _$1 required: A (a: A) =&g
trait F[A,M[]M[A]
}
我希望能够创造以下特质
trait G[A]扩展了F[A,Some]
但这会产生以下错误
错误:(18,20)类型参数[A,Some]不符合trait F的类型参数边界[A,M[u1;]F(A)。获取
}
}
在这种情况下,在f2
中,get
不会返回a
类型的值,即使f
返回aM[a]
Error:(17, 20) type mismatch;
found : _$1
required: A
(a: A) => f(a).get
您可以完全约束
M
的类型,因为它实际上不需要接受类型参数:
trait F[A, M <: Option[A]] { // M no longer takes a type parameter
def v: A
def f: A => M
}
trait G[A] extends F[A, Some[A]] // Must specify M[A] since M doesn't take a type parameter
更新
不幸的是,您的f2
函数无法工作。即使我们知道类型是正确的,编译器也无法正确推断类型(Scala的限制)。您可以将此函数添加到G[A]
中,它将按预期工作,因为M[\u]
现在有一个具体的类型
trait G[A] extends F[A, Some]{
def f3: A => A = a => f(a).get
}
另外,你不应该使用
选项。get
,它违背了使用选项的目的。平面地图它或其他东西:)你能把M[\uU]改成M[a]吗?谢谢Rich,把M[\uU]
改成M[a]
确实有效。谢谢Noah。我编辑了这个问题以匹配我的用例。F[A,M[\uu]
trait G[A] extends F[A, Some]{
def f3: A => A = a => f(a).get
}