이러한 사례가 가장 많이 발생하는 경우는 클래스에서 필드를 선언한 다음, 메소드에서 같은 이름의 지역 값 또는 변수를 사용할 때입니다.


class Foo(foo: Int) {
  def test(): Int = {
    val foo: Int = 1 // highlighted
    foo
  }
}

포착하기는 쉽지만, 필드가 상위 클래스 또는 다른 파일의 특성으로 선언되면 잘 보이지 않을 수 있고 오류가 발생하기 쉬워 까다로워집니다.


// TraitA.scala
trait TraitA {
  def n: Int = 1
}

// ObjectA.scala
object ObjectA extends TraitA {
  def foo(): Unit = {
    val n: Int = 0 // highlighted
  }
}

클래스가 변수를 정의하고 하위 클래스가 동일한 이름의 값을 정의하는 코너 케이스입니다. 하위 클래스 값은 상위 클래스 변수를 재정의할 수 없으며 가리기만 합니다. 이로 인해 사소하지 않은 오류가 발생할 수 있습니다. 이러한 경우, Scala 컴파일러는 -Xlint:private-shadow 옵션을 사용하여 경고합니다.

옵션 섹션의 콤보박스를 사용하여 이 코너 케이스를 강조 표시하는 방법을 제어할 수 있습니다. 클래스 또는 특성 필드를 가리는 로컬 필드의 강조 표시와 함께 항상 강조 표시하도록 선택하거나, 강조 표시하지 않고 다른 강조 표시는 유지하며 컴파일러 옵션 확인을 선택하여 검사가 적절하게 작동하도록 하거나, 다른 가려진 경우가 아닌 코너 케이스(컴파일러 옵션이 있는 경우) 강조 표시하도록 선택할 수 있습니다.


class C(var c: Int)

// `c` shadows `var c` from the `C` class
class D(c: Int) extends C(c) {
  def f: Int = c
}