Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing Multilevel Java Interfaces in Scala

I have following hierarchy in java for my interface

public interface Identifiable<T extends Comparable<T>> extends Serializable {
    public T getId();
}
public interface Function extends Identifiable {
    public String getId();
}
public abstract class Adapter implements Function {
    public abstract String getId();
}

When I try to implement Adapter in scala as follows

class MultiGetFunction extends Adapter {
  def getId() : String = this.getClass.getName
}

I am getting following error

Multiple markers at this line
    - overriding method getId in trait Identifiable of type ()T; method getId has incompatible 
     type
    - overrides Adapter.getId
    - implements Function.getId
    - implements Identifiable.getId
like image 523
Avinash Avatar asked Jan 31 '14 06:01

Avinash


1 Answers

In general, it is a pain working with raw types in java code from Scala.

Try the below:

public interface Function extends Identifiable<String> {
    public String getId();
}

The error is probably due to inability of compiler to determine the type T as no type is mentioned when declaring Function extends Identifiable. This is explained from error:

:17: error: overriding method getId in trait Identifiable of type ()T; method getId has incompatible type

Scala is made to be compatible with Java 1.5 and greater. For the previous versions, you need to hack around. If you cannot change Adapter, then you can create a Scala wrapper in Java:

public abstract class ScalaAdapter extends Adapter {

    @Override
    public String getId() {
        // TODO Auto-generated method stub
        return getScalaId();
    }

    public abstract String getScalaId();

}

And then use this in Scala:

scala>   class Multi extends ScalaAdapter {
     |      def getScalaId():String = "!2"
     |   }
defined class Multi
like image 69
Jatin Avatar answered Sep 19 '22 02:09

Jatin