E048: Super Qualifier Must Be Parent — super 한정자는 부모 타입이어야 해요

E048: Super Qualifier Must Be Parent — super 한정자는 부모 타입이어야 해요

super 접두사에 사용된 한정자(qualifier) 가 클래스의 부모 타입을 가리키지 않을 때 이 에러가 나와요.

출처: Scala 3 Reference

본문

C.super[T] 형태의 super 접두사에서 한정자 T를 쓸 때, T는 반드시 C직접 부모 타입이어야 해요. 이 문법은 클래스가 같은 메서드를 가진 여러 부모를 가질 때, 어느 부모의 구현을 호출할지 명확히 하기 위해 사용돼요.

예제 (Example)

trait A:
  def greet: String = "A"

trait B:
  def greet: String = "B"

class C extends A, B:
  override def greet: String = super[String].greet

StringC의 부모가 아니에요. 그래서 super[String]은 올바르지 않죠.

오류 메시지 (Error)

-- [E048] Reference Error: example.scala:8:31 ----------------------------------
8 |  override def greet: String = super[String].greet
  |                               ^^^^^^^^^^^^^
  |                               String does not name a parent of class C
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | When a qualifier T is used in a super prefix of the form C.super[T],
  | T must be a parent type of C.
  |
  | In this case, the parents of class C are:
  |   - A
  |   - B
  |   - Object
   -----------------------------------------------------------------------------

해결 방법 (Solution)

super 한정자에 실제 부모 타입을 사용하거나, 특정 부모의 메서드를 호출하면 돼요.

// Use an actual parent type in the super qualifier
trait A:
  def greet: String = "A"

trait B:
  def greet: String = "B"

class C extends A, B:
  override def greet: String = super[A].greet
// Or call a specific parent's method
trait A:
  def greet: String = "A"

trait B:
  def greet: String = "B"

class C extends A, B:
  override def greet: String = super[B].greet

더 알아보기 (Learn more)