2012-11-06 12 views
5

मुझे निम्न कोड में कोई समस्या है। यह संकलित नहीं करता है। क्या किसी को यह पता है कि इसे इंस्टेंसऑफ [SomeImpl] या पैटर्न मिलान के बिना संकलित कैसे किया जाए।सबक्लास में विशिष्ट पैरामीटर प्रकार संभव नहीं

मैं ऊपरी या निचली सीमाओं का उपयोग करके कुछ प्रकार के पैरामीटर के बारे में सोच रहा हूं।

object InherenceTryout extends App { 

    import someimpl._ 

    val list = List(SomeImpl("A"), SomeImpl("B")) 
    val result = new SomeHandler().handleBaseList(list) 

    println("%s->%s" format (list, result)) 

} 

package base { 

    // Defines that a 'Base' object can create a new 
    // 'Base' object where another 'Base' object is mixed in 
    // Does not define how the mixing will take place 
    trait Base { 
    def mix(other: Base): Base 
    } 

    // Defines how a default 'Base' object gets mixed into a list of 'Base' objects 
    trait BaseHandler { 
    def defaultBase: Base 
    def handleBaseList(list: List[Base]): List[Base] = list.map(b => b.mix(defaultBase)) 
    } 

} 

package someimpl { 

    import base._ 

    // Some implementation of 'Base' 
    // Defines how a new 'SomeImpl' object is created by mixing in another 
    // 'SomeImpl' object 

    // ERROR: 
    // class SomeImpl needs to be abstract, since method mix in trait Base of type (other: base.Base)base.Base is not defined 
    // (Note that base.Base does not match someimpl.SomeImpl: class SomeImpl in 
    // package someimpl is a subclass of trait Base in package base, but method parameter types must match exactly.) 
    case class SomeImpl(id: String) extends Base { 
     def mix(other: SomeImpl): SomeImpl = SomeImpl("[%s|%s]" format (id, other.id)) 
    } 

    // Defines the default 'SomeImpl' object 
    class SomeHandler extends BaseHandler { 
    def defaultBase = SomeImpl("D") 
    } 

} 

उत्तर

4

का उपयोग प्रकार पैरामीटर:

package base { 

    trait Base[T <: Base[T]] { 
    def mix(other: T): T 
    } 

    trait BaseHandler[T <: Base[T]] { 
    def defaultBase: T 
    def handleBaseList(list: List[T]): List[T] = 
     list.map(b => b.mix(defaultBase)) 
    } 

} 

package someimpl { 

    import base._ 

    case class SomeImpl(id: String) extends Base[SomeImpl] { 
    def mix(other: SomeImpl): SomeImpl = SomeImpl("[%s|%s]" format (id, other.id)) 
    } 

    class SomeHandler extends BaseHandler[SomeImpl] { 
    def defaultBase = SomeImpl("D") 
    } 

} 
+0

यह उत्तर बहुत अच्छा है, लेकिन क्या शायद कोई अन्य समाधान है जहां प्रकार पैरामीटर अनुमानित किया जा सकता है। शायद इसे मिश्रण विधि में डालकर? (वास्तव में मैंने कोशिश की है लेकिन सफल नहीं हुआ) – wwagner4

संबंधित मुद्दे