簡體   English   中英

創建泛型類(帶通配符類型)和多個構造函數

[英]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

鍵入擦除和Java泛型的其他低級細節

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.

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