Несколько вопросов, касающихся сопоставления структур в scala
Вопрос 1) В следующем фрагменте кода я могу передать Bird
и Plane
takeOff
, поскольку Bird
и Plane
структурно соответствует объекту r
требуется для взлета?
import scala.language.reflectiveCalls
case class Bird (val name: String) extends Object {
def fly(height: Int):Unit = {println("bird fly")}
}
case class Plane (val callsign: String) extends Object {
def fly(height: Int):Unit = {println("plane fly")}
}
def takeoff(
runway: Int,
r: { val callsign: String; def fly(height: Int):Unit }) = {
println(r.callsign + " requests take-off on runway " + runway)
println(r.callsign + " is clear for take-off")
r.fly(1000)
}
val bird = new Bird("Polly the parrot"){ val callsign = name }
val a380 = new Plane("TZ-987")
takeoff(42, bird)
takeoff(89, a380)
Вопрос 2) Что такое reflectiveCalls?Мне пришлось импортировать scala.language.reflectiveCalls
, иначе я получаю предупреждение reflective access of structural type member value callsign should be enabled by making the implicit value scala.language.reflectiveCalls visible.
Вопрос 3) Как мне создать Bird
следующим образом: val bird = new Bird("Polly the parrot"){ val callsign = name }
.Разве это не должно быть только val bird = new Bird("Polly the parrot")
.Как это получается.
Вопрос 3.1).bird
все еще имеет тип Bird
или это какой-то другой тип, потому что я передал дополнительные {...}
4) Что такое тип r
в takeOff
.