簡體   English   中英

類型中的多個類型參數

[英]Multiple type parameters in type class

我想使用類型類來設計轉換接口,代碼如下:

case class Kilograms(value: Double)

case class Pounds(value: Double)

trait Convert[T, U] {
  def convert(input: T): U
}

object Convert {
  def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]
  def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

  implicit object kilogramsToPounds extends Convert[Kilograms, Pounds] {
      override def convert(input: Kilograms): Pounds = Pounds(input.value *   2.20462)
    }

  implicit object poundsToKilograms extends Convert[Pounds, Kilograms] {
      override def convert(input: Pounds): Kilograms = Kilograms(input.value / 2.20462)
    }
}

但編譯錯誤:

Error: wrong number of type arguments for A$A95.this.Convert, should be 2
 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

 Error: could not find implicit value for parameter e: A$A95.this.Convert[T,U]
  def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

Error: not enough arguments for method implicitly: (implicit e:   A$A95.this.Convert[T,U])A$A95.this.Convert[T,U].
Unspecified value parameter e.
   def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

如果我改變def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]def apply[T, U](implicit c: Convert[T, U]): Convert[T, U] = c ,沒有編譯錯誤!

我想知道發生了什么事? 另外,我查了一些信息,上下文綁定是用單一類型參數限制的(?)如果我想實現多個類型參數類型類,我該怎么辦?

上下文綁定語法T : U僅適用於只有一個類型參數 S (符合T )的類型U

這是有效的,因為您手動聲明了Convert[T, U]的隱式:

def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

以下內容無效,因為編譯器分別對Convert[T]Convert[U]的上下文邊界進行去糖,這沒有意義。

 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

(嘗試脫糖)

 def apply[T, U](implicit ev1: Convert[T], ev2: Convert[U]) = ...

請參閱SLS 7.4 - 上下文和視圖邊界

方法或非特征類的類型參數A也可以具有一個或多個上下文邊界A : T 在這種情況下,類型參數可以被實例化為任何類型S對於該類型S ,證據存在於S滿足綁定T的實例化點處。 這些證據由類型為T[S]的隱含值組成。

暫無
暫無

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

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