Skip to content

problem with super in traits in case when build-in java.lang.Object methods was "maliciously" made abstract #11075

Open
@ibaklan

Description

@ibaklan

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 class SuppressToString where toString 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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions