2016-07-07 9 views
11

मैं केस ऑब्जेक्ट्स प्रकारों को अमूर्त प्रकारों के रूप में उपयोग करने की कोशिश कर रहा हूं। मैं देख कर हैरान था (समान) नीचे दिए गए कोड को संकलित करता है:अमूर्त प्रकार को प्रकारबद्ध प्रकार के साथ कैसे ठोस रूप से सेट किया जाए?

sealed abstract class Bar 

case object BarOne extends Bar 

case object BarTwo extends Bar 

sealed abstract class Foo { 
    type A <: Bar 

    def f: A 
} 

object Foo { 
    object FooOne extends Foo { 
    type A = BarOne.type 
    val f = BarTwo 
    } 

    object FooTwo extends Foo { 
    type A = BarTwo.type 
    val f = BarOne 
    } 
} 

मेरा असली उदाहरण Foo में parametrized और एक मामले वर्ग के रूप में प्रयोग किया जाता है। तो मैं सिर्फ A एक प्रकार पैरामीटर नहीं बना सकता।

f = BarTwo संकलित करता है, जब ABarOne.type होने के लिए सेट किया गया है?

में AA <: Bar के रूप में व्याख्या किया गया है, ऐसा क्यों है?

Foo के प्रत्येक ऑब्जेक्ट उदाहरण के लिए A को ठोस रूप से सेट करने का कोई तरीका है?


मैं स्कैला 2.11.8 का उपयोग कर रहा हूं।


अद्यतन: जब मैं में FooOne & FooTwo संकलन def attributeType = ... साथ val attributeType = ... की जगह विफल रहता है (उम्मीद है)।

+1

लापता '' FooOne' पर Foo' प्रदान करता है और 'एक टाइपो FooTwo' है? क्योंकि यदि आप इसे जोड़ते हैं तो यह संकलित नहीं होता है। –

+0

@EndeNeu यह एक निरीक्षण था। और आप सही हैं, यह संकलित नहीं है (अपेक्षित के रूप में)। मैंने वास्तविक कोड को यथासंभव करीब के रूप में देखने के लिए प्रश्न अपडेट किया है। बेशक इसका कोई उपयोग नहीं है क्योंकि ऊपर दिया गया कोड संकलित नहीं करता है और मेरा कोड संकलित करता है। – muhuk

+1

@muhuk अगर उपरोक्त कोड संकलित नहीं करता है तो यह आपके संकलन कोड का प्रतिनिधित्व नहीं करता है। यह प्रश्न तब तक उत्तरदायी नहीं है जब तक आपको सही न्यूनतम उदाहरण न मिल जाए। – Daenyth

उत्तर

1

क्या किसी ने आपको स्कैला के आधुनिक संस्करण में अपग्रेड करने का सुझाव दिया है? (मजाक।)

ओवरराइड के बारे में त्रुटि प्रकार के लिए एक अच्छा रास्ता देता है।

$ scala 
Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

sealed abstract class Bar 

case object BarOne extends Bar 

case object BarTwo extends Bar 

sealed abstract class Foo { 
    type A <: Bar 

    def f: A 
} 

object Foo { 
    object FooOne extends Foo { 
    type A = BarOne.type 
    val f = BarTwo 
    } 

    object FooTwo extends Foo { 
    type A = BarTwo.type 
    val f = BarOne 
    } 
} 

// Exiting paste mode, now interpreting. 

<console>:26: error: overriding method f in class Foo of type => Foo.FooOne.A; 
value f has incompatible type 
      val f = BarTwo 
      ^
<console>:31: error: overriding method f in class Foo of type => Foo.FooTwo.A; 
value f has incompatible type 
      val f = BarOne 
      ^

बग this one था, और डुप्लिकेट प्रश्न from last November है।

बग की प्रकृति भी चालाक थी: इसे -Yoverride-objects द्वारा पेश किया गया था, जो कि मेरे बहुत से एसओ में कुछ उपयोगी विकल्प नहीं है। जवाब, और अब एक प्रश्न में।

संपादित करें:

$ scala 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> object X ; object Y 
defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
defined class D 

scala> :quit 
$ scalam 
Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> scala> object X ; object Y 

// Detected repl transcript. Paste more, or ctrl-D to finish. 

defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
defined class D 
// Replaying 3 commands from transcript. 

scala> object X ; object Y 
defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
<console>:13: error: overriding method f in class C of type => X.type; 
method f has incompatible type 
     class D extends C { override def f: Y.type = Y } 
             ^
1

मुझे नहीं पता कि यहां क्या हो रहा है, लेकिन मुझे समस्या थोड़ी अधिक अलग हो गई। इसके अलावा, यह फू उप-वर्गों के साथ-साथ वस्तुओं के साथ भी काम करता है। मैंने पुष्टि की है इस scalac 2.11.8 पर संकलित:

च में
object BarOne 
object BarTwo 

abstract class Foo[A] { 
    def attributeType: A 
} 

object FooContainer { 
    class FooOne extends Foo[BarOne.type] { 
    val attributeType = BarTwo 
    } 

    object FooTwo extends Foo[BarOne.type] { 
    val attributeType = BarOne 
    } 
} 
+0

धन्यवाद। लेकिन यह एक जवाब नहीं है। – muhuk

+0

हाँ, मुझे नहीं पता था कि स्टैक ओवरफ़्लो पर अन्यथा बड़े कोड खंड कैसे प्राप्त करें। – robot1208

0
  1. एक: एक के रूप में एक < व्याख्या की है: बार
  2. क्योंकि है कि क्या एक प्रतिनिधित्व करता है जब एफ सार वर्ग
  3. में परिभाषित किया जाता है
  4. सार परिभाषा अधिभावी के बारे में (नीचे संकलन नहीं होगा) कैसे:

    object Foo { 
    
        object FooOne extends Foo { 
        type A = BarOne.type 
        override val f: A = BarTwo 
        } 
    
        object FooTwo extends Foo { 
        type A = BarTwo.type 
        override val f: A = BarOne 
        } 
    
    } 
    
संबंधित मुद्दे