Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 参数化类型界限_Scala_Types - Fatal编程技术网

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
返回a
M[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
  }