Skip to content

Dotty allow overriding equals and hashCode for Value Classes #22494

Open
@hamzaremmal

Description

@hamzaremmal

Compiler version

590691b

Minimized code

class Bar(val self: Short) extends AnyVal:
    override def equals(that: Any): Boolean = ???
    override def hashCode: Int = ???

Output

[[syntax trees at end of                  genBCode]] // playground.scala
package <empty> {
  @SourceFile("playground.scala") final class Bar extends Object {
    def <init>(self: Short): Unit =
      {
        this.self = self
        super()
        ()
      }
    private val self: Short
    def self(): Short = this.self
    override def equals(that: Object): Boolean =
      Bar.equals$extension(this.self(), that)
    override def hashCode(): Int = Bar.hashCode$extension(this.self())
  }
  @SourceFile("playground.scala") final module class Bar extends Object {
    def <init>(): Unit =
      {
        super()
        ()
      }
    private def writeReplace(): Object =
      new scala.runtime.ModuleSerializationProxy(classOf[Bar])
    final def equals$extension($this: Short, that: Object): Boolean = ???()
    final def hashCode$extension($this: Short): Int = ???()
  }
  final lazy module val Bar: Bar = new Bar()
}

Compiles.

Expectation

Dotty should prohibit overriding equals and hashCode per the Value Classes's specification; SIP-15:

A value class C must satisfy the following criteria:
...
5. C may not define concrete equals or hashCode methods
...

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions