类型类的集合

时间:2015-03-13 23:35:17

标签: scala

在学习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)
  1. 而不是ListBuffer [Any],是否有任何集合(或语言语法)允许存储类型T的共变体?
  2. 如果ListBuffer [AnyRef]而不是ListBuffer [Any],则代码无法编译并出现以下错误:

    请注意,T是无界的,这意味着AnyRef不是已知的父级。 这些类型可以参与值类,但实例 不能出现在单例类型或参考比较中。         def add [A1>:T](t:A1)= {buffer + = t.asInstanceOf [T]}

  3. 无论如何语法表达T是AnyRef的子类型,如:add [A1>:T>:AnyRef]?

0 个答案:

没有答案