scala – 为什么x.toString与(x:Any).toString不同
发布时间:2020-12-16 09:49:39 所属栏目:安全 来源:网络整理
导读:从 How is ScalaRunTime.stringOf(x) not failing when x.toString fails?开始,怎么样 x.toString 不同于 (x: Any).toString 还有,怎么样 "" + x 示例REPL会话: scala -cp joda-time-2.3.jarWelcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Serv
从
How is ScalaRunTime.stringOf(x) not failing when x.toString fails?开始,怎么样
x.toString 不同于 (x: Any).toString 还有,怎么样 "" + x 示例REPL会话: > scala -cp joda-time-2.3.jar Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM,Java 1.8.0_05). Type in expressions to have them evaluated. Type :help for more information. scala> val dt = new org.joda.time.DateTime warning: Class org.joda.convert.FromString not found - continuing with a stub. warning: Class org.joda.convert.ToString not found - continuing with a stub. warning: Class org.joda.convert.FromString not found - continuing with a stub. warning: Class org.joda.convert.ToString not found - continuing with a stub. dt: org.joda.time.DateTime = 2014-05-15T09:27:17.929+01:00 scala> (dt: Any).toString res0: String = 2014-05-15T09:27:17.929+01:00 scala> "" + dt res1: String = 2014-05-15T09:27:17.929+01:00 scala> dt.toString java.lang.AssertionError: assertion failed: org.joda.convert.ToString at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1410) at scala.reflect.internal.Symbols$TypeSymbol.isNonBottomSubClass(Symbols.scala:3040) at scala.reflect.internal.AnnotationInfos$AnnotationInfo.matches(AnnotationInfos.scala:305) at scala.reflect.internal.AnnotationInfos$Annotatable$class.dropOtherAnnotations(AnnotationInfos.scala:68) at scala.reflect.internal.AnnotationInfos$Annotatable$class.hasAnnotation(AnnotationInfos.scala:53) at scala.reflect.internal.Symbols$Symbol.hasAnnotation(Symbols.scala:174) at scala.tools.nsc.typechecker.Infer$class.improves$1(Infer.scala:61) at scala.tools.nsc.typechecker.Infer$$anonfun$4.apply(Infer.scala:65) at scala.tools.nsc.typechecker.Infer$$anonfun$4.apply(Infer.scala:65) 解决方法
你的另一个问题的答案清楚地描述了问题,我将再给它一个镜头,并更详细地描述发生了什么.
当您调用dt.toString时,实际上调用了DateTime类的toString方法,该方法还包含此方法的重载版本.这导致编译错误,而不是运行时错误,编译器中实际上是一个错误(但它似乎是在更新的Scala版本中修复,因为其他答案提到) 在(dt:Any).toString或“”dt的情况下,你不直接调用DateTime中的一个重载的toString方法,而是在Any中定义的方法(实际上是java.lang.Object#toString).编译器甚至没有看到DateTime子类的重载toString方法 – 因此相应的bug不会产生任何问题. 在运行时,由于动态调度,不会调用Any.toString的实现,而是调用DateTime.toString.此调度不是由scalac在编译时完成的,而是由JVM在运行时完成的.后者没有重载错误 – 因此不会发生错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |