Scala:如何设置通用特征?

时间:2017-04-29 12:25:57

标签: scala generics

我无法设置这种通用特征,其参数化形式可以被公共类/对象/方法使用。我尝试了不同的+ | - | _组合: - )

更新:下面的第一条评论显示,如果Wrapper也是参数化的,这可以工作。非参数化包装器可以完成这项工作吗?对象Wrapper可以完成这项工作吗?可以使用+ | - | _和所有能给我带有非参数化包装器或对象的相同结果的神奇组合吗?

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)

1 个答案:

答案 0 :(得分:1)

首先,我没有看到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())