Scala中的头字段值或方法?

Hac*_*g J 1 scala

我正在学习Scala.

我很困惑scala不可变List中的head是方法或字段值.

列表声明如下.

sealed abstract class List[+A] extends .... {
  def isEmpty: Boolean
  def head: A //I think it is field value not a function or method
  def tail: List[A]
Run Code Online (Sandbox Code Playgroud)

但是,intelliJ说这是方法.

究竟是什么?

Ole*_*cov 6

List是一个抽象类,def head这里是一个抽象方法,因此声明和IJ都是正确的.

在非空的列表实例中,即::它实现如下:

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}
Run Code Online (Sandbox Code Playgroud)

因此,字段 head用于实现抽象方法 head.这在Scala中是合法的:val与无参数之间没有太大区别def,您可以以二进制兼容的方式在一个和另一个之间进行更改.

在列表的空实例中,Nil实现此方法以引发异常:

case object Nil extends List[Nothing] {
  override def head: Nothing =
    throw new NoSuchElementException("head of empty list")
/*...*/
}
Run Code Online (Sandbox Code Playgroud)

一个字段不能"抛出异常",但一种方法显然可以.