Scala访问继承了Java类的静态成员

时间:2015-11-15 17:15:09

标签: java scala

考虑以下课程:

//A.java:
public interface A {
    public static final String HIGHER = "higher";
}

//B.java:
public class B implements A {
    public static final String LOWER = "lower";
}

在java代码中,我可以访问HIGHER和LOWER字段:

//JavaClient.java:
public class JavaClient {
    public static void main(String[] args) {
        System.out.println(B.HIGHER);
        System.out.println(B.LOWER);
    }
}

但我不能在Scala中做同样的事情!

//ScalaClient.scala:
object ScalaClient {
  def main (args: Array[String]) {
    println(B.HIGHER)    // Compilation error
    println(B.LOWER)     // OK
  }
}

这对我来说非常意外。为什么Scala看不到继承的psf字段?如何解决?

注意:在我的真实代码中,我无法访问界面A,因为它受到保护并嵌套在另一个类中。

2 个答案:

答案 0 :(得分:3)

只需HIGHER作为A.HIGHER。就Scala而言,Java中的static成员是伴随对象的成员,B的伴随对象不会扩展A的伴随对象:这就是为什么你可以'使用B.HIGHER

  

注意:在我的实际代码中,我无法访问接口A,因为它受到保护并嵌套在另一个类中。

但是,在这种情况下,您遇到了问题。我能想到的一件事是从Java代码中明确地公开常量,例如: (假设您可以更改B):

public class B implements A {
    public static final String LOWER = "lower";
    public static final String HIGHER1 = HIGHER;
}

答案 1 :(得分:1)

您可以通过两种方式解决问题。

1)只需删除界面A&中的static字即可。接口B,它应该工作。

或者

2)创建一个特征( trait是Scala中的一个特性,它与java界面非常相似,但存在很多差异

trait A { }

object A { 
  final val Higher = "higher"
}

现在,您可以从调用者Scala类访问A.Higher