[英]Create a generic class (with wildcard types) and multiple constructors
我對Scala(2.8)很陌生,這是我在Scala中難以表達的東西:
我需要定義一個類(由於與Java庫的互操作性)實現Comparable; 它的泛型類型必須與自身或超類相比
我還需要一個no-args構造函數和另一個使用泛型參數的構造函數
我寫了一個簡單的相當於我想用Java獲得的東西:
public class MyComparable<T extends Comparable<? super T>>{
public MyComparable() {}
public MyComparable(T a){
System.out.println(a);
}
}
我可以在scala REPL中導入這個類而沒有任何問題並實例化它。
這就是我在Scala中寫的嘗試完成同樣的事情:
import java.lang.Comparable
class MyComparable[T <: Comparable[_>:Tb],Tb]()(implicit ev: T=:=Tb) {
def this(a: T) = {
this()
println(a)
}
}
我嘗試使用no-args構造函數作為默認構造函數,或使用帶有T參數的構造函數:在兩種情況下我都得到error: could not find implicit value for parameter ev: =:=[T,Tb]
五
Afaik,=:=默認從scala.Predef導入(事實上,這個代碼只能在一個構造函數中正常工作)
不完全確定你要做什么,但你可以這樣做:
import java.lang.Comparable
class MyComparable[T <: Comparable[_>:Tb],Tb]()(implicit ev: T=:=Tb) {
def this(a: T)(implicit ev: T=:=Tb) = {
this()
println(a)
}
}
你的問題過於復雜 - 盡管如果Java有聲明站點差異會很好,這會使所有這一切都沒有用。 無論如何,這是等效的代碼:
class MyComparable[T <: Comparable[T2], T2 >: T]() {
def this(a: T) = {
this()
println(a)
}
}
假設這不使用原始類型,並且有兩個類型參數而不是一個。 然后,還有一個問題是你實際上試圖用這個宣言完成什么。 我想知道你真正想要的不是這個:
import scala.annotation.unchecked.uncheckedVariance
class MyComparable[-T <: Comparable[T @uncheckedVariance]]() {
def this(a: T) = {
this()
println(a)
}
}
我告訴Scala在我的危險中忽略上面的差異,因為我認為Comparable
實際上可以是反變體。 以下代碼表明確實如此:
scala> trait Cp[-T] {
| def compareTo(other: T): Int
| }
defined trait Cp
scala> class MyComparable[-T <: Cp[T]] {
| }
defined class MyComparable
這仍然與我發布的Java代碼不同,但它似乎足夠接近並且比其他解決方案更清晰:
import java.lang.Comparable
class MyComparable[T <: Comparable[T]]() {
def this(a: Comparable[_ >: T]) = {
this()
println(a)
}
}
這是我讀到的一堆雜項鏈接,因為當我遇到這個問題時,這可能會幫助其他有類似問題的人:
什么時候Scala需要@uncheckedVariance,為什么在GenericTraversableTemplate中使用它?
http://programming-scala.labs.oreilly.com/ch12.html#VarianceUnderInheritance
http://www.scala-lang.org/node/129
http://www.scala-lang.org/node/124
http://scalada.blogspot.com/2008/01/existential-types.html
http://lamp.epfl.ch/~emir/bqbase/2007/06/13/existentials.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.