4
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(如图所示)的对象不定义 type T

我的第一个想法是,我可以将任何类型作为TString 的子类传递,但我不是。那么对象中实际上是什么类型T,我可以通过什么?

4

1 回答 1

5

正如您所说,TinA是抽象的;因此,您将找不到任何可以放入 method 的值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
}

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


进一步搜索发现以下,准重复,SO问题。您可以在此处找到对Scala 票证的引用,该票证将其概述为“功能”——仍然没有显示此“功能”实际上有用的情况:)

于 2012-06-30T14:16:34.850 回答