Scala Edition1 https://www.artima.com/pins1ed/traits.html 에서 프로그래밍의 특성에 관한 장의 코드 예제를 작업했습니다.
오타 때문에 이상한 행동을 겪었습니다. 코드 아래의 특성의 메서드를 재정의하는 동안 오버라이드 (override) 된 메소드의 반환 형식이 다르지만 어떤 컴파일 오류를 제공하지 않는 Unit
대 String
. 그러나 객체에서 메소드를 호출하면 Unit을 반환하지만 아무것도 인쇄하지 않습니다.
trait Philosophical {
def philosophize = println("I consume memory, therefore I am!")
}
class Frog extends Philosophical {
override def toString = "green"
override def philosophize = "It aint easy to be " + toString + "!"
}
val frog = new Frog
//frog: Frog = green
frog.philosophize
// no message printed on console
val f = frog.philosophize
//f: Unit = ()
그러나 재정의 된 메소드에 명시 적 반환 유형을 제공하면 컴파일 오류가 발생합니다.
class Frog extends Philosophical {
override def toString = "green"
override def philosophize: String = "It aint easy to be " + toString + "!"
}
override def philosophize: String = "It aint easy to be " + toString +
^
On line 3: error: incompatible type in overriding
def philosophize: Unit (defined in trait Philosophical);
found : => String
required: => Unit
첫 번째 경우 컴파일 오류가없는 이유를 누구나 설명 할 수 있습니다.
컴파일러는 다른 결과 유형을 가진 메소드를 대체하려고 시도하는 유효한 힌트를 인쇄했습니다.
—
Andriy Plokhotnyuk
그렇습니다.하지만 제 질문은 왜 컴파일러가 첫 번째 경우에 컴파일러를 통과했는지
—
Shanil
경험상, 항상 반환 유형 _ (특히 공개 API) _에 대해 명시 적입니다. 타입 추론은 지역 변수에 좋습니다.
—
Luis Miguel Mejía Suárez '12