java - 演示嵌套作用域的 Scala 代码在 Java 中的行为不同

标签 java scala

我编写了一个 Scala 类 Sheltie 来了解作用域在 Scala 中的工作原理。我写了一个等效的 Java Sheltie 类作为交叉引用。这是我遇到麻烦的地方。

在 Scala Sheltie 类的主体中,有一个调用名为 bark 的方法的方法,紧接着有一个 println 语句吠叫 调用。等效方法调用 bark() 可以放在另一个方法内的等效 Java 类中,但在任何方法之外,它会提示 Duplicate method bark() 是可以理解的。

我了解 Java 代码的工作原理,因此这种行为(在 Java 中)并不奇怪。令人困惑的是 Scala 的行为方式为何如此。

我希望解决的是:为什么 Scala 允许在类主体中进行“调用”,为什么它允许在 if block 中创建另一个 val 定义,而 Java 却不允许。

Foo.scala

class Sheltie {
  val barkNum = 10

  def bark() {
    //local barkNum of "bark" method
    val barkNum = 20

     if(true){
       //local "barkNum" of if-block
       val barkNum = 30 //why does Scala not complain of a duplicate local variable, when            Java does in the equivalent program Sheltie.java
       println("Inside if block: No of times Riley barked is " + barkNum)
     }

     println("Outside if block: No of times Riley barked is " + barkNum)
  }

  bark //Why does this work, when you can't do this in Java
  println("Outside bark: No of times Riley barked is " + barkNum)
}

最佳答案

当你在类主体中说 Scala 允许调用时,主体实际上是构造函数,所以这等同于:

public Sheltie()
{
    bark();
    System.out.println("Outside bark: No of times Riley barked is " + barkNum);
}

在 Java 中。

关于java - 演示嵌套作用域的 Scala 代码在 Java 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11619784/

相关文章:

scala - 在 Spark Streaming 中重用 kafka producer

java - 错误: JAVA_HOME is set to an invalid directory in libGDX

java - 使用注释的 Hibernate ID 生成器 "increment"

Scala: bool 值到选项

scala - 使用 HDFS 的 Scalding 教程 : Data is missing from one or more paths in: List(tutorial/data/hello. txt)

scala T 不是一个类

java - 部署时 persistence.xml 中的 Manege jta-data-source

java - 在 jpa 中使用多对多关系时的空表

java - 在java swing中当前窗口(第一帧)中单击按钮时如何打开新窗口(第二帧)

scala - 在 Scala 特征上定义隐式 View 边界