无法实现Summable

时间:2017-08-29 15:40:15

标签: ceylon

我试图实现类DistanceCMDistanceMM,我希望这些可以互换,只要它们都继承自Distance

然而,我收到此错误:

  

"错误:(46,76)锡兰:类型参数'其他'声明   '累加型'有争论'距离'这不能分配给鞋帮   绑定' Summable' '其他'"

...我无法解密...错误消息在下面的代码中引用此行:

shared actual Distance plus(Distance other) 

这是当前的代码:

abstract class Distance() of DistanceMM | DistanceCM {
    shared formal Distance multiplyScalar(Float scalar);
}


class DistanceMM(variable Float val) extends Distance() satisfies Summable<Distance>
{
    shared Float distanceInMillimeters;
    shared Float distanceInCentimeters;

    switch (unit)
    case (millimeter) {
        distanceInMillimeters => val;
        distanceInCentimeters => val / 10;
    }
    case (centimeter) {
        distanceInMillimeters => val * 10;
        distanceInCentimeters => val;
    }


    shared actual DistanceMM multiplyScalar(Float scalar) {
        val = val * scalar;
        return this;
    }


    shared actual Distance plus(Distance other) {
            switch (other)
            case (DistanceMM) {
                return DistanceMM(val + other.distanceInMillimeters(), unit);
            }
            case (DistanceCM) {
                return DistanceMM(val + other.distanceInCentimeters(), unit);
            }
    }
}


class DistanceCM(variable Float val) extends Distance() satisfies Summable<Distance>
{
    shared Float distanceInMillimeters;
    shared Float distanceInCentimeters;

    switch (unit)
    case (millimeter) {
        distanceInMillimeters => val;
        distanceInCentimeters => val / 10;
    }
    case (centimeter) {
        distanceInMillimeters => val * 10;
        distanceInCentimeters => val;
    }

    shared actual DistanceCM multiplyScalar(Float scalar) {
        val = val * scalar;
        return this;
    }
    // implementation missing
}

1 个答案:

答案 0 :(得分:3)

interface Summable<Other> of Other​ given Other satisfies Summable<Other>

注意约束(given子句)。您声称DistanceMM满足Summable<Distance>,但Distance不符合Other的约束(Distance不满足Summable<Distance> )。试试这个:

interface Distance of Centimeter | Millimeter satisfies Summable<Distance> {}

class Centimeter() satisfies Distance {
    shared actual Distance plus(Distance other) => nothing;
}

class Millimeter() satisfies Distance {
    shared actual Distance plus(Distance other) => nothing;
}