2011-09-28 24 views
14

के साथ किसी विधि को ओवरराइड करना object के साथ खाली-कोष्ठक विधि को ओवरराइड करना क्यों संभव है?किसी ऑब्जेक्ट

trait A { 
    def meth = {} 
    def meth_p() = {} 
} 

class B extends A { 
    object meth_p 
} // compiles 

अधिभावी कोष्ठकों विधि संकलित करता है नहीं:

class B1 extends A { 
    object meth 
} // does not compile 

न तो (override आपरिवर्तक के बिना) निम्नलिखित संयोजन काम से कोई भी कार्य:

class BX extends A { 
    // of course, each declaration should get its own class 
    def meth = {} 
    def meth_p() = {} 
    def meth() = {} 
    def meth_p = {} 
    val meth = {} 
    val meth_p = {} 
    // ... 
} 

इस दस्तावेज और उपयोगी व्यवहार है ? मैं इस आकस्मिक ओवरराइड की वजह से बस एक बहुत सूक्ष्म बग में चला गया है।

उत्तर

6

यह सुनिश्चित है कि नरक एक बग की तरह दिखता है। यदि आप ऐसा करते हैं तो इसके आसपास दूसरी तरफ सिर्फ वीडर हो जाता है।

class A { 
    object m { override def toString = "object m" } 
} 

class B extends A { 
    def m() = "def m" 
} 

scala> (new A).m 
res0: object A#m = object m 

scala> (new A).m() // doesn't compile 

scala> (new B).m 
<console>:10: error: ambiguous reference to overloaded definition, 
both method m in class B of type()java.lang.String 
and object m in class A of type object B#m 
match expected type ? 
       (new B).m 
        ^
scala> (new B).m() 
java.lang.VerifyError: class B overrides final method m.()LA$m$; 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at scala.tools.nsc.interpreter.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:52) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at scala.tools.nsc.interpreter.AbstractFileClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$loadClass(AbstractFileClassLoader.scala:17) 
     at scala.tools.nsc.util.ScalaClassLoader$class.loadClass(ScalaClassLoader.scala:50) 
     at scala.tools.nsc.interpreter.AbstractFileClassLoader.loadClass(AbstractFileClassLoader.scala:17) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at .<init>(<console>:10) 
     at .<clinit>(<console>) 
     at .<init>(<console>:11) 
     at .<clinit>(<console>) 
     at $print(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
     at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
     at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
     at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
     at java.lang.Thread.run(Unknown Source) 
+0

हाँ, यह एक बग की तरह दिखता है। – Debilski

+0

https://issues.scala-lang.org/browse/SI-5429 – soc

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