2014-01-31 31 views
6

我在java以下分级来我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(); 
} 

当我尝试在scala实现Adapter如下

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

我收到以下错误

实现多级的Java接口
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 
+0

http://stackoverflow.com/q/5279149/1296806其中包括一个经典的paulp回应。 –

回答

16

通常,在Scala的java代码中处理原始类型是一件痛苦的事情。

尝试以下:

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

该错误可能是由于编译器无法确定,因为没有类型类型T声明Function extends Identifiable当被提及。这是从错误中解释的:

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

Scala与Java 1.5及更高版本兼容。对于以前的版本,你需要破解。 如果你不能改变Adapter,那么您可以在Java中创建Scala的包装:

public abstract class ScalaAdapter extends Adapter { 

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

    public abstract String getScalaId(); 

} 

然后在Scala中使用:

scala> class Multi extends ScalaAdapter { 
    |  def getScalaId():String = "!2" 
    | } 
defined class Multi 
+0

感谢Jatin,但我无法更改Java定义,而我的Java版本是1.6 – Avinash

+0

@Avinash更新了代码。这应该使它工作。 – Jatin