【问题标题】:access java base class's static member in scala在scala中访问java基类的静态成员
【发布时间】:2012-08-15 13:38:15
【问题描述】:

我有一些用Java编写的代码。对于新课程,我计划用 Scala 编写。我在访问基类的受保护静态成员时遇到问题。下面是示例代码:

Java 代码:

class Base{
    protected static int count = 20;
}

scala 代码:

class Derived extends Base{
    println(count);
}

对此有什么建议吗?在不修改现有基类的情况下如何解决这个问题

【问题讨论】:

  • 如果基类上没有访问修饰符,它们必须在同一个包中,否则这将不起作用。
  • 对不起,我们在基类上有 public 修饰符,但仍然不起作用。
  • 说说问题所在怎么样?有任何错误信息吗?
  • 似乎当我们将两个类放在不同的包中时,我们会得到编译错误:对象B中的变量a不能在对象com.fcy.sss.B中访问受保护的变量a是不允许的,因为封闭类类 D 不是 sss 包中定义目标的对象 B 的子类 这些是文件: B.java 文件:包 com.fcy.sss;公共类 B { 受保护的静态 int a = 30; } D.scala 文件:导入 com.fcy.sss.B 类 D 扩展 B{ println(B.a); }

标签: java scala inheritance static scala-java-interop


【解决方案1】:

这在 Scala 中是不可能的。由于 Scala 没有 static 的符号,因此您无法访问父类的 protected static 成员。这是known limitation

解决方法是这样做:

// Java
public class BaseStatic extends Base {
  protected int getCount() { return Base.count; }
  protected void setCount(int c) { Base.count = c; }
}

现在您可以从这个新类继承并通过 getter/setter 方法访问静态成员:

// Scala
class Derived extends BaseStatic {
  println(getCount());
}

这很难看——但如果你真的想使用protected static 成员,那你就必须这样做。

【讨论】:

  • 谢谢,我现在必须这样做
  • 受保护的方法是这样吗?特别是受保护的构造函数?
  • @om-nom-nom - 访问祖先伴生对象的受保护成员也存在类似问题,但除此之外,我认为您可以使用非静态方法/构造函数。跨度>
  • @DaoWen 我问是因为现在我在扩展 guava 的 FinalizablePhantomReference 时遇到问题,并且认为这是理想的行为还是应该报告它
猜你喜欢
  • 2016-02-16
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多