我是一个新手,Scala和我现在面临一个问题,我无法理解和解决。 我写了一个通用的trait
是这一个:
trait DistanceMeasure[P<:DbScanPoint] {
def distance(p1:P, p2:P):Double
}
其中DbScanPoint
很简单:
trait DbScanPoint extends Serializable {}
然后,我有扩展它们以下两类:
class Point2d (id:Int, x:Double, y:Double) extends DbScanPoint {
def getId() = id
def getX() = x
def getY() = y
}
class EuclideanDistance extends DistanceMeasure[Point2d] with Serializable {
override def distance(p1:Point2d,p2:Point2d) = {
(p1.getX()-p2.getX())*(p1.getX()-p2.getX()) + (p1.getY()-p2.getY()) * (p1.getY()-p2.getY())
}
}
并在最后我有这个类:
class DBScanSettings {
var distanceMeasure:DistanceMeasure[_<:DbScanPoint] = new EuclideanDistance
//...
}
我的问题是,如果当我写在我的测试主要是:
val dbScanSettings = new DBScanSettings()
dbScanSettings.distanceMeasure.distance(new Point2d(1,1,1), new Point2d(2,2,2))
我得到以下编译错误:
type mismatch;
[error] found : it.polito.dbdmg.ontic.point.Point2d
[error] required: _$1 where type _$1 <: it.polito.dbdmg.ontic.point.DbScanPoint
我不明白这是问题。 我做了一个非常类似的事情与其他类和我没有错误,那么这个错误的原因很不起眼的我。
可能有人帮助我吗?
谢谢。
UPDATE
我设法做什么,我需要的代码更改为:
trait DistanceMeasure {
def distance(p1:DbScanPoint, p2:DbScanPoint):Double
}
很显然使所有的相关的变化。