繁体   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