簡體   English   中英

為什么類型參數綁定T <:Comparable [T]為T = Int失敗?

[英]Why does the type parameter bound T <: Comparable[T] fail for T = Int?

scala> class Foo[T <: Comparable[T]](val x : T)
defined class Foo

scala> (3: Int).asInstanceOf[Comparable[Int]]  
res60: java.lang.Comparable[Int] = 3

scala> new Foo(3)                              
<console>:13: error: inferred type arguments [Int] do not conform to class Foo's type parameter bounds [T <: java.lang.Comparable[T]]
       new Foo(3)
       ^

第二個表達式是類型擦除的結果嗎?

我將如何定義Foo以便我可以使用Int對其進行參數化,但仍然能夠使用其實例變量執行某些排序行為?

使用視圖綁定

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo[T <% Comparable[T]](val x : T)
defined class Foo

scala> new Foo(3)
res0: Foo[Int] = Foo@9aca82

如上所述,問題仍然沒有答案(盡管“使用視圖邊界”解決了問題,這更有用)。 答案很簡單,Scala中的Int應該等同於Java中的int ,它根本不是一個類,因此甚至不能成為Comparable (盡管可以使用defender方法在Java 7中解決)。 ..我不知道他們會不會這樣做。

使用視圖綁定的解決方案在整個Scala中用於解決可以實現某些但不實現的類的問題,因為它不受Scala的控制 - 即Java類。

而且,當然,程序員自己可以使用它來處理來自庫和框架的類似內容,或者只是在庫周圍生成包裝器以賦予它Scala-ish的感覺。

或者,您可以使用上下文綁定

class Foo[T: Ordering](val v: T)

要么

class Foo[T: java.util.Comparator](val v: T)

上下文綁定表示一個斷言,當調用構造函數時,范圍內存在隱式的Ordering [T](或java.util.Comparator [T]),並且等效於添加隱式參數:

class Foo[T](val v: T)(implicit ev: Ordering[T])

這種方法的優點是它允許您根據上下文使用備用順序:

// by default, new Foo("a", "c", "b").items == List("a", "b", "c")
class Foo[T: Ordering](xs: T*) {
   val items = xs.toList.sorted
}

// with this object in scope, 
// new Foo("a", "c", "b").items == List("c", "b", "a")
implicit val descending = Ordering[String].reverse

暫無
暫無

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

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