[英]Union types as bound for type parameters of a trait (scala)
如何將特征的類型參數約束為一組不同的類型(例如,由聯合類型約束)?
作為一個具體的例子,我想創建一個特征IntegralIndex[T]
,其中T
必須為Int
或Long
。
我嘗試了關於聯合類型的這個問題的第一個答案:
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]
除非您有證據表明存在T
的NumericIndex
類型類的實例。
現在,當您實現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.