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しても、タイプは定義されませんT

私の最初の考えは、TStringのサブクラスである任意の型を渡すことは許可されていますが、許可されていません。では、実際にはどのタイプがTオブジェクトにあり、何を通過させることができますか?

4

1 に答える 1

5

あなたが言うように、TinAは抽象的です。したがって、実際に修正されるサブタイプが作成されるまで、メソッドfに入力できる値は見つかりません。AT

(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質問が見つかります。そこに「機能」としてそれを概説するScalaチケットへの参照を見つけることができます-それでもこの「機能」が実際に役立つ場合は示されていません:)

于 2012-06-30T14:16:34.850 に答える