抽象类型的益智游戏
答
A
不是抽象的。如果它是抽象的,然后它会看起来像:
abstract class A {
type R
}
或
trait A {
type R
}
现在,我不能在规范中找到它(没有多少运气在那里找到的东西最近)但我以前见过这个。如果没有使用该类型,那么它看起来好像没有被评估,这意味着缺乏完整性不是问题。
如果你真的想要A
是抽象的,可以使用上述定义之一来代替。
答
只是为了阐述@ alex22的评论:
scala> trait T { type R; def foo(r: R) = r }
defined trait T
scala> new T{}.foo("")
<console>:12: error: type mismatch;
found : java.lang.String("")
required: _6.R where val _6: java.lang.Object with T
new T{}.foo("")
^
scala> new T{ type R = String }.foo("")
res37: java.lang.String = ""
答
抽象类型似乎有默认值Nothing
。
这是正确的 - 具体类可以有抽象类型。事实上,即使抽象类型用在方法签名中,它仍然会编译。只是在类型在子类中定义之前,方法不能被调用。 – axel22