2014-03-25 68 views
2

類層次結構中的Java:斯卡拉無法解析繼承Java接口不變成員

接口:集羣分類

Kluster層次結構圖如下

Cluster <- , 
      +-- Kluster 
Classify <- ' 

文件:oop/Cluster.java

package oop; 

public interface Cluster { 
    public String HELLO = "hello"; 
} 

文件:OOP/Kluster.java

package oop; 

interface Classify { 
    public String GOODBYE = "good bye"; 
} 

public class Kluster implements Cluster, Classify { 

} 

文件:OOP/KlusterMain.java

package oop; 

public class KlusterMain { 
    public static void main(String[] args) { 
     System.out.println(Kluster.HELLO); 
     System.out.println(Kluster.GOODBYE); 
    } 
} 

到目前爲止一切正常。我可以打印HELLO和GOODBYE常量。

現在,當我嘗試從Scala編譯器訪問它們時,它會給出錯誤。

文件:OOP/cluster.scala

package oop 

object cluster { 
    def main(args: Array[String]) { 
    val k = new Kluster 
    println(Cluster.HELLO) 
    println(Classify.GOODBYE) 
    println(Kluster.HELLO) // <- this is the problematic line 
    } 
} 

錯誤:

Scala Problem 
value HELLO is not a member of object oop.Kluster 
/scala-snippets/src/main/scala/oop/cluster.scala 
line 8 

爲什麼不能斯卡拉解決Kluster對象同時實現了集羣分類層次接口?

回答

4

你知道把常量放入接口中用於實現類是不好的方法,不是嗎?在Java中,如果需要,可以使用帶私有構造函數的final類,並使用import static來縮短常量名稱。在Scala中,您使用object和導入。但是斯卡拉沒有靜態字段的概念 - 它具有正確參與繼承的對象。將Java的靜態字段與適當的面向對象的系統統一起來是不可能的,所以在Scala中你不能使用子類中的靜態成員(字段和方法)。請參閱here

+0

當然,我這樣做。這是來自Apache Mahout 0.7代碼庫的簡化代碼。我正在嘗試從Scala使用它。 – tuxdna

+1

Scala應該與Java兼容。我想還有更多的不兼容性Scala和Java。 – tuxdna

+1

是的,Scala應該(並且實際上)與Java兼容。兼容性水平是一個問題。 Java中的幾個設計決定無法在Scala中以一種理智的方式得到支持,而不會破壞某些東西,因此Java的這些部分被認爲不是很重要,而且Scala不支持它們。其中一個特性是靜態繼承。 Scala沒有靜態的概念,並且繼承靜態成員在Java中是非常罕見的用例,所以它在Scala中不被支持。 –