Skip to content

equals is not symmetric #217

@xuwei-k

Description

@xuwei-k

steps

build.sbt

scalaVersion := "3.8.3"

enablePlugins(ContrabandPlugin)

project/build.properties

sbt.version=1.12.8

project/plugins.sbt

addSbtPlugin("org.scala-sbt" % "sbt-contraband" % "0.8.0")

src/main/contraband/A.contra

package com.example

@target(Scala)

interface A {
  a: String!
}

type B implements A {
  a: String!
  b: Int!
}

src/main/scala/C.scala

package com.example

class C(override val a: String) extends A(a)

object Main {
  def main(args: Array[String]): Unit = {
    val c = C("x")
    val a = B("x", 3)
    println(c == a)
    println(a == c)
  }
}

problem

[info] running com.example.Main 
true
false

https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)

It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

A.scala

abstract class A(
  val a: String) extends Serializable {

  override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match {
    case x: A => (this.a == x.a)
    case _ => false
  })

B.scala

final class B private (
  a: String,
  val b: Int) extends com.example.A(a) with Serializable {

  override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match {
    case x: B => (this.a == x.a) && (this.b == x.b)
    case _ => false
  })

note

Should we remove equals and hashCode from interface?

diff --git a/library/src/main/scala/sbt/contraband/JavaCodeGen.scala b/library/src/main/scala/sbt/contraband/JavaCodeGen.scala
index 7cef2bc..8c65c08 100644
--- a/library/src/main/scala/sbt/contraband/JavaCodeGen.scala
+++ b/library/src/main/scala/sbt/contraband/JavaCodeGen.scala
@@ -55,8 +55,6 @@ class JavaCodeGen(
          |    ${genConstructors(i, parent)}
          |    ${genAccessors(lfs)}
          |    ${genMessages(msgs)}
-         |    ${genEquals(i)}
-         |    ${genHashCode(i)}
          |    ${genToString(i, toStringImpl)}
          |}""".stripMargin
 
diff --git a/library/src/main/scala/sbt/contraband/ScalaCodeGen.scala b/library/src/main/scala/sbt/contraband/ScalaCodeGen.scala
index cb31119..fe92e43 100644
--- a/library/src/main/scala/sbt/contraband/ScalaCodeGen.scala
+++ b/library/src/main/scala/sbt/contraband/ScalaCodeGen.scala
@@ -176,8 +176,6 @@ class ScalaCodeGen(
          |  $alternativeCtors
          |  $lazyMembers
          |  $messages
-         |  ${genEquals(i, intfLang)}
-         |  ${genHashCode(i, intfLang)}
          |  ${genToString(i, toStringImpl)}
          |}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions