Open
Description
Consider following code
package crafts
object Main {
def main(args: Array[String]): Unit = {
val obj = new Combined
println(s"obj: ${obj}")
}
class Combined extends SuppressToString with WrapToString
abstract class SuppressToString {
override def toString: String
}
trait WrapToString {
override def toString: String = "WrapToString: " + super.toString
}
}
- Expected result: should fail on compile time since
WrapToString
trait can not be mixed with classSuppressToString
wheretoString
method is abstract - Actual result: code compiles successfully and then predictably fails on runtime with the following error
Exception in thread "main" java.lang.AbstractMethodError: java.lang.Object.toString()Ljava/lang/String;
at crafts.Main$Combined.crafts$Main$WrapToString$$super$toString(Main.scala:10)
at crafts.Main$WrapToString.toString(Main.scala:17)
at crafts.Main$WrapToString.toString$(Main.scala:17)
at crafts.Main$Combined.toString(Main.scala:10)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at crafts.Main$.main(Main.scala:7)
at crafts.Main.main(Main.scala)
(related discussion added)