2017-08-29 65 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; 
}