Scala无法解析继承的Java接口常量成员

tux*_*dna 5 java oop scala interface

Java中的类层次结构:

接口:聚类分类

Kluster类的层次结构如下所示

Cluster  <- ,
            +-- Kluster
Classify <- '
Run Code Online (Sandbox Code Playgroud)

文件:oop/Cluster.java

package oop;

public interface Cluster {
    public String HELLO = "hello";
}
Run Code Online (Sandbox Code Playgroud)

文件:oop/Kluster.java

package oop;

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

public class Kluster implements Cluster, Classify {

}
Run Code Online (Sandbox Code Playgroud)

文件:oop/KlusterMain.java

package oop;

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

到目前为止,一切都按预期进行。我可以打印 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
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:

Scala Problem
value HELLO is not a member of object oop.Kluster
/scala-snippets/src/main/scala/oop/cluster.scala
line 8
Run Code Online (Sandbox Code Playgroud)

为什么Scala不能解析Kluster对象同时实现ClusterClassify接口的层次结构?

Vla*_*eev 4

您确实知道将常量放入接口中以在实现类中使用它们是一种不好的方法,不是吗?在 Java 中,您可以使用final带有私有构造函数的类,并import static根据需要使用来缩短常量名称。在 Scala 中,您使用objects 和导入。但 Scala 没有静态字段的概念 - 它有正确参与继承的对象。将 Java 中的静态字段与适当的面向对象系统统一起来是不可能的,因此在 Scala 中你不能使用子类中的静态成员(字段和方法)。

另请参阅此处

  • Scala 应该与 Java 兼容。我猜想 Scala 和 Java 之间存在更多的不兼容性。 (2认同)