자기 타입에 부합하지 않음
자기 타입에 부합하지 않음 (Does Not Conform To Self Type)
클래스의 자기 타입(self type)이 상속하는 트레이트의 자기 타입과 부합하지 않을 때 나오는 에러예요.
본문
클래스의 자기 타입이 자신이 상속하는 트레이트의 자기 타입과 부합하지 않으면 이 에러가 발생해요.
자기 타입 표기(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)
더 알아보기
- 요구되는 트레이트를 섞어 넣거나, 상속하는 클래스에도 같은 자기 타입을 붙이면 돼요.