scala – 用对象覆盖一个方法
发布时间:2020-12-16 09:17:30 所属栏目:安全 来源:网络整理
导读:为什么可以用对象覆盖一个空的括号方法? trait A { def meth = {} def meth_p() = {}}class B extends A { object meth_p} // compiles 覆盖没有括号的方法不会编译: class B1 extends A { object meth} // does not compile 以下任何组合都不起作用(不带
为什么可以用对象覆盖一个空的括号方法?
trait A { def meth = {} def meth_p() = {} } class B extends A { object meth_p } // compiles 覆盖没有括号的方法不会编译: class B1 extends A { object meth } // does not compile 以下任何组合都不起作用(不带覆盖修饰符): 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 = {} // ... } 这是记录和有用的行为吗?我刚刚遇到一个非常微妙的错误,因为这个意外的覆盖. 解决方法
这肯定是地狱看起来像一个错误.如果你这样做的话,其他方法就会变得更加脆弱.
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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |