Почему 'private val' и 'private final val' различны?

Раньше я думал, чтоprivate val а такжеprivate final val такие же, пока я не увидел раздел 4.1 в Scala Reference:

Определение постоянного значения имеет вид

final val x = e

где е - постоянное выражение (§6,24). Окончательный модификатор должен присутствовать, и никакая аннотация типа не может быть дана. Ссылки на постоянное значение x сами по себе рассматриваются как константные выражения; в сгенерированном коде они заменяются определениемс правой стороны е.

И я написал тест:

class PrivateVal {
  private val privateVal = 0
  def testPrivateVal = privateVal
  private final val privateFinalVal = 1
  def testPrivateFinalVal = privateFinalVal
}

javap -c выход:

Compiled from "PrivateVal.scala"
public class PrivateVal {
  public int testPrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #19                 // Method privateVal:()I
       4: ireturn       

  public int testPrivateFinalVal();
    Code:
       0: iconst_1      
       1: ireturn       

  public PrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #24                 // Method java/lang/Object."":()V
       4: aload_0       
       5: iconst_0      
       6: putfield      #14                 // Field privateVal:I
       9: return
}

Байт-код так же, как сказал Scala Reference:private val не является .private final val

Почему неscalac просто лечитьprivate val какprivate final val? Есть ли какая-то основная причина?

Ответы на вопрос(2)

Ваш ответ на вопрос