簡體   English   中英

聯合類型綁定到特征的類型參數(scala)

[英]Union types as bound for type parameters of a trait (scala)

如何將特征的類型參數約束為一組不同的類型(例如,由聯合類型約束)?

作為一個具體的例子,我想創建一個特征IntegralIndex[T] ,其中T必須為IntLong

我嘗試了關於聯合類型的這個問題的第一個答案:

sealed abstract class NumericIndex[T]
object NumericIndex {
  implicit object IntWitness extends NumericIndex[Int]
  implicit object LongWitness extends NumericIndex[Long]
}

trait IntegralIndex[T : NumericIndex]

但這不起作用; 我得到的traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'

還有其他建議嗎? 誠然,我不理解關於工會類型問題的其他解決方案,所以如果答案只是在那里使用不同的答案,或者甚至知道無法完成,我會很感激。

類型類方法可能是在這里完成您想要的最簡潔的方法,並且您的版本正確。 它不能以當前形式工作,因為上下文邊界只是隱式參數的語法糖。 以下特征定義,例如:

trait IntegralIndex[T: NumericIndex]

會不會像這樣的東西:

trait IntegralIndex[T](implicit num: NumericIndex[T])

但是traits沒有構造函數,所以這不是有效的Scala語法。 但是,您可以這樣寫:

trait IntegralIndex[T] {
  implicit def num: NumericIndex[T]
}

這可以確保您無法創建IntegralIndex[T]除非您有證據表明存在TNumericIndex類型類的實例。

現在,當您實現IntegralIndex ,您可以編寫:

case class MyIndex[T](whatever: String)(implicit val num: NumericIndex[T])

要么:

case class MyIndex[T: NumericIndex](whatever: String) {
  implicit val num = implicitly[NumericIndex[T]]
}

現在,對於使用MyIndex任何人來說,所有隱式管道都是不可見的。

暫無
暫無

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

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