2015-03-13 9 views
14

मैं निम्नलिखितमामला वर्ग निर्माता तर्क पिछले तर्क मूल्य

trait Stateful { 
    type State 
} 

case class SystemState(system: Stateful, state: system.State) // does not compile 

है कि ऐसा करने के लिए कोशिश कर रहा हूँ पर निर्भर करता है प्रकार, state के प्रकार system (का मूल्य) पर निर्भर करता है। यही कारण है कि, हालांकि, समर्थित नहीं है:

अवैध निर्भर विधि के प्रकार: पैरामीटर, एक ही अनुभाग में अन्य पैरामीटर के प्रकार या एक पहले एक

समारोह तर्क के साथ में प्रकट होता है मैं तर्क विभाजित किया जा सकता दो तर्क सूचियों है, जो एक मामले वर्ग निर्मापक साथ संभव नहीं है में:

def f(system: Stateful)(state: system.State): Unit = {} // compiles 
सबसे अच्छा मैं कर सकता हूँ

है:

case class SystemState[S](system: Stateful { type State = S }, state: S) // compiles 

लेकिन मैं सोच रहा था कि यह एक प्रकार के पैरामीटर के बिना संभव होना चाहिए, क्योंकि डॉटी में, मुझे लगता है कि टाइप पैरामीटर सदस्यों को टाइप करने के लिए desugared हैं।

मेरा प्रश्न तब है, क्या यह टाइप पैरामीटर के बिना व्यक्त किया जा सकता है?

अधिक सामान्य संदर्भ में, मैं इस बात की खोज कर रहा हूं कि किस प्रकार के पैरामीटर टाइप सदस्यों द्वारा प्रतिस्थापित किए जा सकते हैं, और ऐसा करने का अच्छा विचार कब है।

उत्तर

8

दुर्भाग्य से निर्भर प्रकारों के लिए एकाधिक पैरामीटर सूची दृष्टिकोण not supported for constructors है, इसलिए नहीं, आपको एक प्रकार पैरामीटर पेश करना होगा।

आप उस तथ्य को छिपाने सकता है अगर यह परेशान हो जाता है, हालांकि

trait Stateful { 
    type State 
} 

object SystemState { 
    def apply(system: Stateful)(state: system.State): SystemState = 
    new Impl[system.State](system, state) 

    private case class Impl[S](val system: Stateful { type State = S }, 
          val state: S) 
    extends SystemState { 
    override def productPrefix = "SystemState" 
    } 
} 
trait SystemState { 
    val system: Stateful 
    val state: system.State 
} 

case object Test extends Stateful { type State = Int } 
val x = SystemState(Test)(1234) 
संबंधित मुद्दे