Tôi đã làm việc thông qua các ví dụ mã từ chương về Đặc điểm lập trình trong Scala Edition1 https://www.artima.com/pin1ed/traits.html
và bắt gặp một hành vi kỳ lạ vì lỗi đánh máy của tôi. Mặc dù phương thức ghi đè của một đặc điểm bên dưới đoạn mã không đưa ra bất kỳ lỗi biên dịch nào mặc dù các kiểu trả về của phương thức được ghi đè là khác Unit
so với String
. Nhưng khi gọi phương thức trên một đối tượng, nó trả về Đơn vị nhưng không in bất cứ thứ gì.
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 = ()
Nhưng khi tôi đưa ra kiểu trả về rõ ràng trong phương thức bị ghi đè, nó sẽ báo lỗi biên dịch:
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
Bất cứ ai có thể giúp giải thích tại sao không có lỗi biên dịch trong trường hợp đầu tiên.