Scala 特性 : val/def and require

标签 scala illegalargumentexception

以下代码抛出 IllegalArgumentException :

trait T{
  val x: Long
  require(x > 0)
}

object T extends App{
  val y = new T{ val x = 42L }
}

而以下没有:
trait T{
  def x(): Long
  require(x() > 0)
}

object T extends App{
  val y = new T{ def x() = 42L }
}

这是为什么?什么时候require()叫?为什么是val甚至在那个时候定义?

最佳答案

因为 def声明一个方法,由编译器放在类中,所以一编译就存在。为了返回一些东西,一个方法必须运行到它实际返回一些东西的地方,所以在你的第二个例子中没有问题。
val声明一个“不可变值”,尽管它仍然需要初始化,在此之前它保存其类型的默认值 - 在这种情况下为 0。此初始化发生在 trait T 的构造函数之后。运行,除非您更改示例以使用早期初始化:

val y = new { val x = 42L } with T

关于Scala 特性 : val/def and require,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228108/

相关文章:

scala - 如何隐藏我的隐式方法或禁用特定密封系列的 `LabelledGeneric`?

scala - 如何避免在循环中分配的 var

java - IllegalArgumentException 输入 == null

java - 如何在 Java Junit 中测试异常

scala - 具有特征和扩展该特征的同名对象是否是一种好的样式?

java - Akka:使用非默认构造函数在 Scala 中定义一个 actor 并从 Java 代码创建它

Scala:自动检测 CSV 文件中的定界符/分隔符

java - 调用反射Class.getMethod时出现异常

spring-mvc - DispatcherServlet 导致 java.lang.IllegalArgumentException : Servlet mapping specifies an unknown servlet name [default]

java.lang.IllegalArgumentException Comparison 方法违反了它的一般契约!在集合中#sort