需要帮助搞清楚scala编译器错误

kla*_*ose 6 reduce scala compiler-errors

我一直在使用scala进行项目,但是我收到一些我不太了解的错误消息.我正在使用的课程相对简单.例如:

abstract class Shape
case class Point(x: Int, y: Int) extends Shape
case class Polygon(points: Point*) extends Shape
Run Code Online (Sandbox Code Playgroud)

现在假设我创建了一个Polygon:

val poly = new Polygon(new Point(2,5), new Point(7,0), new Point(3,1))
Run Code Online (Sandbox Code Playgroud)

然后,如果我试图确定可能包含多边形的最小可能矩形的位置和大小,我会得到各种我不太了解的错误.

下面是不同尝试的片段以及它们产生的相应错误消息.

val upperLeftX = poly.points.reduceLeft(Math.min(_.x, _.x))
Run Code Online (Sandbox Code Playgroud)

给出错误:
" 扩展函数缺少参数类型((x $ 1)=> x $ 1.x) "

val upperLeftX =  
         poly.points.reduceLeft((a: Point, b: Point) => (Math.min(a.x, b.x)))
Run Code Online (Sandbox Code Playgroud)

给出这个错误:
" 类型不匹配;
找到:( Point,Point)=> Int
required :( Any,Point)=> Any
"

我对这两个错误消息都非常困惑.如果有人能够更清楚地解释我做错了什么,我会非常感激.是的,我看到第二个错误说我需要输入"Any"但我不明白如何实现一个可以根据需要进行更改的更改.显然,简单地将"a:Point"改为"a:Any"并不是一个可行的解决方案,所以我错过了什么?

Ale*_*nov 6

该类型的reduceLeftreduceLeft[B >: A](op: (B, A) => B): B,APoint的,你正试图把它应用到(a: Point, b: Point) => (Math.min(a.x, b.x)).

因此编译器的原因是:Math.min(a.x, b.x)返回Int,因此Int必须是子类型B.并且B还必须是超类型Point.为什么?B是累加器的类型,它的初始值是Point你的第一个Polygon.那是意思B >: A.

唯一的超型IntPointAny; 所以BAny和类型op应该是(Any, Point) => Any,正如错误消息指出.