在具体类中使用抽象类型?

时间:2012-06-30 13:45:51

标签: scala abstract-type

scala> class A { type T <: String; def f(a: T) = println("foo")}
defined class A

scala> (new A).f("bar")
<console>:9: error: type mismatch;
found   : java.lang.String("bar")
required: _1.T where val _1: A
             (new A).f("bar")
                       ^

A具有抽象类型T,但不是抽象类。创建A的对象(如图所示)不会定义类型T

我的第一个想法是,我被允许传递任何类型为T这是String的子类,但我不是。那么对象中实际是什么类型T以及我允许通过什么类型?

1 个答案:

答案 0 :(得分:5)

正如你所说,T中的A是抽象的;因此,除非f的子类型实际修复了A,否则您无法找到方法T中的任何值。

(new A { type T = String }).f("bar")

这个想法是可以连续改进类型:

trait Var[A] { def get: A; def set(v: A): Unit }

trait Sys {
  type V[A] <: Var[A]

  def swap[A](x: V[A], y: V[A]): Unit = {
    val tmp = x.get
    x.set(y.get)
    y.set(tmp)
  }
}

trait HistVar[A] extends Var[A] { def created: java.util.Date }

trait HistSys extends Sys {
  type V[A] <: HistVar[A]

  def newest[A](x: V[A], y: V[A]): A =
    if (x.created after y.created) x.get else y.get
}

但当然你的问题是好的 - 你没有理由想要一个类型参数不固定的类的具体实例化。我想不出一个有意义的案例。 (当然,如果它不涉及类型T,你仍然可以使用可访问的功能)


进一步搜索发现以下,准重复,SO question。你可以在那里找到一个Scala ticket的引用,它将它概括为一个“特征” - 仍然没有显示这个“特征”实际上有用的情况:)