steps
build.sbt
scalaVersion := "3.8.3"
enablePlugins(ContrabandPlugin)
project/build.properties
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?
|
| ${genEquals(i, intfLang)} |
|
| ${genHashCode(i, intfLang)} |
|
| ${genEquals(i)} |
|
| ${genHashCode(i)} |
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)}
|}
steps
build.sbt
project/build.properties
sbt.version=1.12.8project/plugins.sbt
src/main/contraband/A.contra
src/main/scala/C.scala
problem
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)
A.scala
B.scala
note
Should we remove
equalsandhashCodefrominterface?contraband/library/src/main/scala/sbt/contraband/ScalaCodeGen.scala
Lines 179 to 180 in b94325b
contraband/library/src/main/scala/sbt/contraband/JavaCodeGen.scala
Lines 58 to 59 in b94325b