考虑以下课程:
//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,因为它受到保护并嵌套在另一个类中。
答案 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
。