자기 타입에 부합하지 않음

자기 타입에 부합하지 않음 (Does Not Conform To Self Type)

클래스의 자기 타입(self type)이 상속하는 트레이트의 자기 타입과 부합하지 않을 때 나오는 에러예요.

출처: Scala 3 Reference

본문

클래스의 자기 타입이 자신이 상속하는 트레이트의 자기 타입과 부합하지 않으면 이 에러가 발생해요.

자기 타입 표기(self type annotation, 예: self: SomeType =>)는 이 트레이트를 구현하는 모든 구체 클래스가 SomeType에도 부합해야 한다는 계약을 선언해요. 이런 트레이트를 상속할 때는 상속하는 클래스가 반드시 그 요구를 충족해야 해요.

예시

trait HasLogger:
  self: Logger =>
  def log(msg: String): Unit

trait Logger:
  def write(msg: String): Unit

class MyClass extends HasLogger:
  def log(msg: String): Unit = println(msg)

에러 메시지

-- [E058] Type Mismatch Error: example.scala:8:6 -------------------------------
8 |class MyClass extends HasLogger:
  |      ^
  |illegal inheritance: self type MyClass of class MyClass does not conform to self type Logger
  |of parent trait HasLogger
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | I tried to show that
  |   MyClass
  | conforms to
  |   Logger
  | but none of the attempts shown below succeeded:
  |
  |   ==> MyClass  <:  Logger  = false
  |
  | The tests were made under the empty constraint
   -----------------------------------------------------------------------------

해결 방법

// Mix in the required trait
trait HasLogger:
  self: Logger =>
  def log(msg: String): Unit

trait Logger:
  def write(msg: String): Unit

class MyClass extends HasLogger with Logger:
  def log(msg: String): Unit = println(msg)
  def write(msg: String): Unit = println(msg)
// Or add a matching self type to the extending class
trait HasLogger:
  self: Logger =>
  def log(msg: String): Unit

trait Logger:
  def write(msg: String): Unit

abstract class MyClass extends HasLogger:
  self: Logger =>
  def log(msg: String): Unit = println(msg)

더 알아보기

  • 요구되는 트레이트를 섞어 넣거나, 상속하는 클래스에도 같은 자기 타입을 붙이면 돼요.