我在 Scala 2.12 上有點掙扎:
我有以下層次結構:
trait A
case class B(format: String) extends A
trait Writer {
def write(config: A): Unit
}
val writer = new Writer {
override def write(config: A) = println("hi")
}
val w = B("console")
writer.write(w)
這作業正常。但我想為作者提供一個替代實作:
val writer = new Writer {
override def write(config: B) = println("hi")
}
但我得到 object creation impossible, since method write in trait Writer of type (config: Playground.A)Unit is not defined
我認為因為 B 是 A,所以這應該有效。如何write使用型別為Bwhere的配置覆寫B <: A
Scastie:https ://scastie.scala-lang.org/QBaiiDP4Sj2lptUjrWLJYw
編輯: - - - - - - - - - - - - - - - - - - - - - - - - ------------
根據一些輸入,我將實作更改為:
sealed trait A
case class B(format: String) extends A
trait Writer[ T] {
def write[S >: T](config: S): Unit
}
val writer: Writer[A] = new Writer[B] {
override def write[B](config: B) = println("hi")
}
val b = B("console")
writer.write(b)
哪個有效。
但是如果我修改它以訪問 中的變數config,它會中斷:
sealed trait A
case class B(format: String) extends A
trait Writer[ T] {
def write[S >: T](config: S): Unit
}
val writer: Writer[A] = new Writer[B] {
override def write[B](config: B) = println(config.format)
}
val b = B("console")
writer.write(b)
和 value format is not a member of type parameter B
https://scastie.scala-lang.org/Xj2rKbbiTmG7raZgQZYfHA
欣賞輸入。
uj5u.com熱心網友回復:
您與最新版本非常接近。正如 Matthias Berndt 所指出的,該write方法宣告了一個新的型別引數,但應該使用在 trait 上宣告的那個。此外,型別引數應該是逆變的。
此代碼編譯并列印console:
sealed trait A
case class B(format: String) extends A
trait Writer[-T <: A] {
def write(config: T): Unit
}
val writer: Writer[B] = new Writer[B] {
override def write(config: B) = println(config.format)
}
val b = B("console")
writer.write(b)
請注意,因為B是 的子型別A,所以您也可以將 aWriter[A]與 的實體一起使用B。因為Writer是逆變的,你可以將一個 type 的值賦給一個 typeWriter[A]的變數Writer[B]:
val aWriter: Writer[B] = new Writer[A] {
override def write(config: A) = println(s"Got A: $config")
}
aWriter.write(b) // prints "Got A: B(console)"
您不能做相反的事情(Writer[B]為Writer[A]變數賦值),因為 aWriter[A]將能夠接受 type 的任何值A,而 aWriter[B]只能接受 type 的值B。
https://scastie.scala-lang.org/TimMoore/bd5E1p99TLCDVfMbElKqFg/8
uj5u.com熱心網友回復:
它不起作用,因為Writer宣告其write方法將接受任意A. 如果有人決定傳遞一個A不是Btowriter.write怎么辦?那么它就行不通了,所以編譯器會阻止你這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387353.html
標籤:斯卡拉 Scala-2.12
上一篇:在Jupyter實驗室中從bigquery讀取時無法實體化提供程式com.google.cloud.spark.bigquery.BigQueryRelationProvider
