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
以及我允许通过什么类型?
答案 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的引用,它将它概括为一个“特征” - 仍然没有显示这个“特征”实际上有用的情况:)