在学习Scala基础知识的过程中,我尝试使用代码片段来为具有类型类的共变量集合建模以用于学习目的。
sealed trait PseudoCollection[+T]
import scala.collection.mutable._
class Box[+T] extends PseudoCollection[T]{
//private var buffer = ListBuffer[T]()
//Replacing Any with T causes a compile time error
private var buffer = ListBuffer[Any]()
override def toString() = buffer.toString
def add[A1 >: T](t : A1) = { buffer += t.asInstanceOf[T] }
}
sealed trait PreciousMetal
class Gold(val name:String = "Gold") extends PreciousMetal
class Silver(val name:String = "Silver") extends PreciousMetal
class BarGold(override val name:String = "Bar Gold") extends Gold
val preciousMtlBox = new Box[PreciousMetal]()
preciousMtlBox.add(new Gold("Golden Ring"))
preciousMtlBox.add(new Silver("Silver Ring"))
val goldOnlyBox = new Box[Gold]()
goldOnlyBox.add(new Gold("Some golden jewel"))
goldOnlyBox.add(new BarGold("Some golden bar"))
println(preciousMtlBox)
println(goldOnlyBox)
如果ListBuffer [AnyRef]而不是ListBuffer [Any],则代码无法编译并出现以下错误:
请注意,T是无界的,这意味着AnyRef不是已知的父级。 这些类型可以参与值类,但实例 不能出现在单例类型或参考比较中。 def add [A1>:T](t:A1)= {buffer + = t.asInstanceOf [T]}
无论如何语法表达T是AnyRef的子类型,如:add [A1>:T>:AnyRef]?