scala类中属性的可见性

Posted

技术标签:

【中文标题】scala类中属性的可见性【英文标题】:Visibility of properties in scala class 【发布时间】:2011-03-02 01:26:28 【问题描述】:

我通过以下方式在类的构造函数中定义了一个属性:

class Step(val message:String = "")

当我尝试从 Java 代码访问 message 值时,会出现可见性错误。为什么?

【问题讨论】:

可能是与默认和命名参数有关的错误。 【参考方案1】:

如果您添加 @scala.reflect.BeanProperty 注释,您将获得“自动”getset 方法

见http://www.scala-lang.org/docu/files/api/scala/reflect/BeanProperty.html

scala> class Step(@scala.reflect.BeanProperty val  message:String )
defined class Step

scala> val s = new Step("asdf")
s: Step = Step@71e13a2c

scala> s.message
res6: String = asdf

scala> s.getMessage
res10: String = asdf

【讨论】:

@isola009 Scala 的 IDE 插件仍然存在错误,有时会发生这种情况。 NetBeans 和 Eclipse 的 Scala 插件也是如此,它们有时也会显示虚假错误。【参考方案2】:

代码是正确的,在这种情况下消息应该是公开的,但由于某种原因它不是。因此,作为 WO,您可以将其设为私有(只需删除“val”)并找到一种方法为该值生成 getter:

class Step(message: String = "")
  def getMessage() = message  

或者:

class Step(@scala.reflect.BeanProperty message: String = "")

并编译:

> scalac -cp . Step.scala

然后创建调用Java类:

public class SomeClass
  public static void main(String[] args) 
    Step step = new Step("hello");
    System.out.println(" " + step.getMessage());
  

然后编译运行:

> javac -cp . SomeClass.java
> java -cp "/home/olle/scala-2.8.0.Beta1-prerelease/lib/scala-library.jar:." SomeClass
hello
>

【讨论】:

【参考方案3】:

我猜想在 Java 代码中您尝试使用step.message 访问该字段。 确实有这样一个领域,而且是私有的。这就是你得到可见性错误的原因。当您在 Scala 中声明“val”字段时,编译器会生成一个字段和访问器方法。所以在java中你应该使用step.message()

【讨论】:

【参考方案4】:

您是否尝试过使用getMessage()?也许 scala 正在生成访问器。

【讨论】:

以上是关于scala类中属性的可见性的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中声明可见性/访问的方式有何不同?

Scala_ 类_可见性

Spark 作业中的 Scala 成员字段可见性

降低基类属性的可见性

php获取可见性

如何维护适配器类中recyclerview项目的可见性