Koert Kuipers
Aug 31, 2022
i recently was debugging a simple refactoring of some scala code that led to a surprise NullPointerException
. we generally avoid using null
and prefer to use Option[T]
where None replaces (null: T)
, and we assume in our code base that no null
will be passed in. in this case it seemed a null had sneaked in there anyhow, and before the refactoring we handled it correctly while after the refactoring we were no longer, leading to the NullPointerException
. while digging it in seemed like we were magically able to handle methods on null
instances of a class! so this is a blog post about some funky edge case in scala that made this possible.
lets assume we have a class for a person and we want to check if the person is null
. you could try this:
case class Person(first: String, last: String) { def isNull: Boolean = this == null }
but of course this method isNull
doesn’t do anything useful because you cannot call a method on null
:
scala> Person("koert", "kuipers").isNull val res0: Boolean = false scala> (null: Person).isNull java.lang.NullPointerException ... 59 elided
so what i realized by accident while debugging is that there is a way to make this work using scala’s implicit class:
case class Person(first: String, last: String) implicit class RichPerson(val person: Person) extends AnyVal { def isNull: Boolean = person == null }
now the result is:
scala> Person("koert", "kuipers").isNull
val res0: Boolean = false
scala> (null: Person).isNull
val res1: Boolean = true
i cannot recommend relying on this! however i thought it was fun to share…
Mirror Link – https://technotes.tresata.ai/method-on-null