2014-01-31 66 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