簡體   English   中英

在 scala 2.13+ / 3.x 中,我們如何解決抽象類型的菱形繼承問題?

[英]In scala 2.13+ / 3.x, how can we address the diamond inheritance problem of abstract types?

這是一個簡單的例子:

trait Sup {

  type A

  def a: A

  def b: A
}

trait Sub1 extends Sup {

  override type A = Product

  override def a = "s" -> "s"
}

trait Sub2 extends Sup {

  override type A = Serializable

  override def b = "s" -> "s"
}

object SS extends Sub1 with Sub2

顯然它會導致編譯錯誤,因為兩個override type A是互斥的。 這是違反直覺的,因為 Product 和 Serializable 通常一起使用。 或者,我可以定義:

trait Sup {

  type A

  def a: A
}

trait Sub1 extends Sup {

  override type A <: Product

  override def a = "s" -> "s"
}

trait Sub2 extends Sup {

  override type A <: Serializable

  override def b = "s" -> "s"
}

object SS extends Sub1 with Sub2 {

  override type A = Product with Serializable
}

這使得 a 和 b 的定義無效,因為類型 A 尚未具體化,此外,行override type A = Product with Serializable顯然是一個樣板,可以改為推斷。

定義允許菱形混合的抽象類型同時避免樣板在每個實現中顯式定義它的正確方法是什么?

我猜你失去了下限。

"s" -> "s"具有類型(String, String) ,它是Product (和Serializable )的子類型,但不是A <: Product (或A <: Serializable )的子類型。

嘗試

trait Sup {
  type A
  def a: A
  def b: A
}

trait Sub1 extends Sup {
  override type A >: (String, String) <: Product
  override def a = "s" -> "s"
}

trait Sub2 extends Sup {
  override type A >: (String, String) <: Serializable
  override def b = "s" -> "s"
}

object SS extends Sub1 with Sub2 {
  override type A = Product with Serializable
}

SS.a: (String, String)
SS.b: (String, String)
implicitly[SS.A =:= (Product with Serializable)]

如果您將Sub1#aSub2#b返回類型指定為A (以上它們被推斷為(String, String)即返回類型在方法覆蓋時被縮小)然后

trait Sup {
  type A
  def a: A
  def b: A
}

trait Sub1 extends Sup {
  override type A >: (String, String) <: Product
  override def a: A = "s" -> "s"
}

trait Sub2 extends Sup {
  override type A >: (String, String) <: Serializable
  override def b: A = "s" -> "s"
}

object SS extends Sub1 with Sub2 {
  override type A = Product with Serializable
}

SS.a: Product with Serializable
SS.b: Product with Serializable
implicitly[SS.A =:= (Product with Serializable)]

你甚至可以做

object SS extends Sub1 with Sub2 {
  override type A >: (String, String) <: Product with Serializable
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM