鉴于课程A
是:
class A {
type R
}
为什么以下代码编译(并运行)?
val a = new A
println(a)
A
不应该是抽象的吗?
答案 0 :(得分:7)
A
不是抽象的。如果它是抽象的,那么它看起来像:
abstract class A {
type R
}
或
trait A {
type R
}
现在,我在规范中找不到它(最近在那里找到东西并没有太多运气)但我以前见过这个。如果没有使用该类型,那么它似乎没有被评估,这意味着缺乏完整性不是问题。
如果您真的希望A
是抽象的,请改为使用上述定义之一。
答案 1 :(得分:2)
请详细说明@ 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 = ""
答案 2 :(得分:0)
抽象类型似乎有默认值Nothing
。