scalagen icon indicating copy to clipboard operation
scalagen copied to clipboard

Wrongly converts classes with multiple constructors

Open OlivierBlanvillain opened this issue 10 years ago • 5 comments

Here is an example:

class A {
    public A() {
        System.out.println(1);
    }
    public A(String s) {
        System.out.println(2);
    }
}

Which is converted to:

class A {
  println(1)
  def this(s: String) {
    this()
    println(2)
  }
}

Note that it might be impossible to perfectly match Java behavior, especially when inheritance is involved, see http://stackoverflow.com/questions/3299776/in-scala-how-can-i-subclass-a-java-class-with-multiple-constructors.

OlivierBlanvillain avatar Feb 16 '14 00:02 OlivierBlanvillain

Sorry, this kind of delegation is the best that can be done.

timowest avatar Feb 16 '14 19:02 timowest

What about something like this? It does not look very nice but at least it's behavior equivalent:

class A private (n: Nothing) {
  def this() {
    this(null)
    println(1)
  }
  def this(s: String) {
    this(null)
    println(2)
  }
}

OlivierBlanvillain avatar Feb 16 '14 21:02 OlivierBlanvillain

Hm, this is an interesting approach, I will consider it.

timowest avatar Feb 16 '14 21:02 timowest

@OlivierBlanvillain: why is the current behavior wrong? the default constructor shouldn't be declared explicitly in Scala... I would be very disappointed if Scala wrapped the default constructor in a def this().

erikkaplun avatar Feb 16 '14 21:02 erikkaplun

I think the point is that if the behaviour can't be solved with constructor delegation then a common delegation target could be used.

This is again a tradeoff between correctness of the result vs having a scalaesque result.

timowest avatar Feb 16 '14 21:02 timowest