Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How is ScalaRunTime.stringOf(x) not failing when x.toString fails?

Whilst trying to figure out some joda-time DateTime (timestamp formatting) issues I opened a REPL with

scala -cp joda-time-2.3.jar

and forgot to add the joda-convert jar, and eventually got a

java.lang.AssertionError: assertion failed: org.joda.convert.ToString

(The entire stacktrace)

I was able to simplify this to:

> 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-14T17:54:24.511+01:00

scala> scala.runtime.ScalaRunTime.stringOf(dt)
res0: String = 2014-05-14T17:54:24.511+01:00

scala> dt.toString
java.lang.AssertionError: assertion failed: org.joda.convert.ToString

How is ScalaRunTime.stringOf(dt) succeeding where dt.toString fails?

like image 422
Dale Wijnand Avatar asked Mar 20 '23 15:03

Dale Wijnand


1 Answers

You didn't post the stack trace, which is a compiler crash and not a failed assertion by joda.

The REPL is crashing compiling the expression.

It looks like AbstractDateTime has an overloaded toString method, and overload resolution crashes on the @ToString annotation on the usual toString(). (The symbol for ToString is missing.)

But stringOf(x: Any) is just invoking Object.toString(), of course.

There are some known issues, apparently. A recent issue was fixed.

On 2.10.4:

scala> (dt: Any).toString
res0: String = 2014-05-14T11:56:21.794-07:00

scala> dt.toString
<console>:9: error: ambiguous reference to overloaded definition,
both method toString in class AbstractDateTime of type (x$1: String, x$2: java.util.Locale)String
and  method toString in class AbstractDateTime of type (x$1: String)String
match expected type ?
              dt.toString
                 ^

scala> dt.toString()  // crashes

2.10.3 is bumpier and claims error while loading DateTime, class file is broken.

The crash is on 2.11.0.

like image 187
som-snytt Avatar answered Mar 22 '23 20:03

som-snytt