簡體   English   中英

Scala:如何設置通用特征?

[英]Scala: How do I set a generic Trait?

我無法設置此通用特征,其通用化類/對象/方法可以使用其參數化形式。 我嘗試了不同的+ |-| _組合:-)

更新:下面的第一條注釋顯示,如果包裝器也已參數化,則可以使用此功能。 非參數化包裝器可以完成這項工作嗎? 對象包裝器可以做這項工作嗎? + |-| _以及所有這些的魔術組合能否通過非參數化的包裝器或對象為我提供相同的預期結果?

case class OldStuff(name: String)
case class NewStuff(id: Int)

trait Poster[T] {
def translate(i: Int):T
}

class NewPoster extends Poster[NewStuff] {
def translate(i: Int):NewStuff = new NewStuff(3)
}

class OldPoster  extends Poster[OldStuff] {
def translate(i: Int):OldStuff = new OldStuff("A" * 3)
}

val old = new OldPoster()
// so far so good

class  Wrapper{
var poster: Poster[_] = null  
def setter(p: Poster[_]) = {poster = p } 
def prepare_input[A]( ) = {
  val i: Int = 5
  println(poster.translate(i))
}
}

val w= new Wrapper()
val old = new OldPoster()
w.setter(old)
scala> w.setter(old)
<console>:58: error: type mismatch;
 found   : OldPoster
 required: Poster[_]
       w.setter(old)

首先,我看不到Scala 2.11出現此類錯誤。

然后,最好避免被Poster[_]刪除:

class Wrapper[T] {
  var poster: Poster[T] = null
  def setter(p: Poster[T]) = {poster = p }
  def prepare_input() = {
    val i: Int = 5
    println(poster.translate(i))
  }
}

val w= new Wrapper[OldStuff]()
val old = new OldPoster()
w.setter(old)

最后,不使用可變性會使代碼更易於預測並發性。

class Wrapper[T](poster: Poster[T]) {
  def prepare_input() = {
    val i: Int = 5
    println(poster.translate(i))
  }
}

val w = new Wrapper(new OldPoster())

暫無
暫無

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

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