This page is no longer maintained — Please continue to the home page at www.scala-lang.org

Scala Compiler question

1 reply
Andres Almiray
Joined: 2009-02-24,
User offline. Last seen 42 years 45 weeks ago.

Hi,

I've been doing a series of experiments to generate Scala friendly classes
from Java.
As you know the following Scala class:

class ScalaPerson(var name:String)

is compiled to the following byte code:

Compiled from "ScalaPerson.scala"
public class ScalaPerson extends java.lang.Object implements
scala.ScalaObject{
private java.lang.String name;
public ScalaPerson(java.lang.String);
public void name_$eq(java.lang.String);
public java.lang.String name();
public int $tag() throws java.rmi.RemoteException;
}

with that info in mind I create a JavaPerson class whose byte code output is
pretty much the same as ScalaPerson plus get/setName following the JavaBeans
convention:

Compiled from "JavaPerson.java"
public class JavaPerson extends java.lang.Object implements
scala.ScalaObject{
private java.lang.String name;
public JavaPerson(java.lang.String);
public void setName(java.lang.String);
public void name_$eq(java.lang.String);
public java.lang.String getName();
public java.lang.String name();
public int $tag();
}

The Java code not surprisingly is very verbose

import scala.ScalaObject;
public class JavaPerson implements ScalaObject {
private String name;

public JavaPerson( String name ) {
this.name = name;
}

public void setName( String name ) {
this.name = name;
}

public void name_$eq( String name ) {
setName(name);
}

public String getName() {
return name;
}

public String name() {
return getName();
}

public int $tag() {
return 0;
}
}

Now the problem comes when using JavaPerson from Scala

object Output {
def main(args: Array[String]) {
var sperson: ScalaPerson = new ScalaPerson("Scala")
println(sperson.name)

var jperson: JavaPerson = new JavaPerson("Java")
println(jperson.name)

sperson.name = "ScalaScala"
println(sperson.name)

// jperson.name = "JavaJava"
jperson.name_$eq( "JavaJava")
println(jperson.name)
}
}

when the comment is removed the compiler yields the following error

Output.scala:12: error: reassignment to val
jperson.name = "JavaJava"
^
one error found

scalac -version -> Scala compiler version 2.7.3.final -- Copyright
2002-2009, LAMP/EPFL
javac -version -> javac 1.6.0_12

I'll appreciate any pointers you can give me, thanks!

Andres Almiray
Joined: 2009-02-24,
User offline. Last seen 42 years 45 weeks ago.
Re: Scala Compiler question

*bump*

Andres Almiray wrote:
>
> Hi,
>
> I've been doing a series of experiments to generate Scala friendly classes
> from Java.
> As you know the following Scala class:
>
> class ScalaPerson(var name:String)
>
> is compiled to the following byte code:
>
> Compiled from "ScalaPerson.scala"
> public class ScalaPerson extends java.lang.Object implements
> scala.ScalaObject{
> private java.lang.String name;
> public ScalaPerson(java.lang.String);
> public void name_$eq(java.lang.String);
> public java.lang.String name();
> public int $tag() throws java.rmi.RemoteException;
> }
>
> with that info in mind I create a JavaPerson class whose byte code output
> is pretty much the same as ScalaPerson plus get/setName following the
> JavaBeans convention:
>
> Compiled from "JavaPerson.java"
> public class JavaPerson extends java.lang.Object implements
> scala.ScalaObject{
> private java.lang.String name;
> public JavaPerson(java.lang.String);
> public void setName(java.lang.String);
> public void name_$eq(java.lang.String);
> public java.lang.String getName();
> public java.lang.String name();
> public int $tag();
> }
>
> The Java code not surprisingly is very verbose
>
> import scala.ScalaObject;
> public class JavaPerson implements ScalaObject {
> private String name;
>
> public JavaPerson( String name ) {
> this.name = name;
> }
>
> public void setName( String name ) {
> this.name = name;
> }
>
> public void name_$eq( String name ) {
> setName(name);
> }
>
> public String getName() {
> return name;
> }
>
> public String name() {
> return getName();
> }
>
> public int $tag() {
> return 0;
> }
> }
>
> Now the problem comes when using JavaPerson from Scala
>
> object Output {
> def main(args: Array[String]) {
> var sperson: ScalaPerson = new ScalaPerson("Scala")
> println(sperson.name)
>
> var jperson: JavaPerson = new JavaPerson("Java")
> println(jperson.name)
>
> sperson.name = "ScalaScala"
> println(sperson.name)
>
> // jperson.name = "JavaJava"
> jperson.name_$eq( "JavaJava")
> println(jperson.name)
> }
> }
>
> when the comment is removed the compiler yields the following error
>
> Output.scala:12: error: reassignment to val
> jperson.name = "JavaJava"
> ^
> one error found
>
> scalac -version -> Scala compiler version 2.7.3.final -- Copyright
> 2002-2009, LAMP/EPFL
> javac -version -> javac 1.6.0_12
>
> I'll appreciate any pointers you can give me, thanks!
>

Copyright © 2012 École Polytechnique Fédérale de Lausanne (EPFL), Lausanne, Switzerland