2017-08-29 4 views
2

Ich versuche Klassen zu implementieren DistanceCM und DistanceMM, und ich möchte diese summable austauschbar sein, solange sie beide von Distance erben.Ärger Umsetzung summierbaren

Allerdings bekomme ich diesen Fehler:

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

... was ich nicht entziffern kann ... Die Fehlermeldung bezieht sich auf diese Zeile in dem folgenden Code:

shared actual Distance plus(Distance other) 

Diese Code ist der Strom:

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 
} 

Antwort

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

Nicht Eis die Beschränkung (die given Klausel). Sie behaupten, dass DistanceMM erfüllt Summable<Distance>, aber Distance erfüllt nicht die Bedingung Other (Distance erfüllt nicht Summable<Distance>). Versuchen Sie Folgendes:

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; 
}