我无法设置这种通用特征,其参数化形式可以被公共类/对象/方法使用。我尝试了不同的+ | - | _组合: - )
更新:下面的第一条评论显示,如果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)
答案 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())