2017-08-29 68 views
2

我试图实现类DistanceCMDistanceMM,我希望它们可以互换,只要它们都从Distance继承。执行Summable时出现问题

不过,我得到这个错误:

"Error:(46, 76) ceylon: type parameter 'Other' of declaration 'Summable' has argument 'Distance' which is not assignable to upper bound 'Summable' of 'Other'"

...我不能破译......该错误消息指这条线下面的代码:

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 
} 

回答

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

不冰约束(given子句)。您声称DistanceMM满足Summable<Distance>,但Distance不符合OtherDistance不符合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; 
}