【发布时间】:2015-11-10 16:20:33
【问题描述】:
在定义函数时,我可以创建一个隐式参数列表来引用前面显式参数列表中的变量,但在定义类时却不行。我是不是做错了什么?
为了说明,让我们制作一些对象。此处的目的是创建幻像类型的层次结构以“标记”对象的层次结构。我希望隐含的ev 保证对象来自正确的层次结构。
trait Token {
type Phantom
}
object TopToken extends Token {
trait Phantom
}
object SubToken extends Token {
trait Phantom <: TopToken.Phantom
}
object ForeignToken extends Token {
trait Phantom // doesn't extend TopToken.Phantom
}
def f(t: Token)(implicit ev: t.Phantom <:< TopToken.Phantom) { println(t) }
函数f 工作正常:
scala> f(SubToken)
$line5.$read$$iw$$iw$SubToken$@76c2539f
scala> f(ForeignToken) // This should fail.
<console>:12: error: Cannot prove that ForeignToken.Phantom <:< TopToken.Phantom.
f(ForeignToken)
^
但请注意,当我使用相同的参数列表来定义一个类时会发生什么:
scala> class F(t: Token)(implicit ev: t.Phantom <:< TopToken.Phantom)
<console>:9: error: not found: value t
class F(t: Token)(implicit ev: t.Phantom <:< TopToken.Phantom)
^
我正在运行 Scala 2.11.2。
更新进一步的实验表明implicit 没有任何区别。
【问题讨论】:
-
作为一个普通的类 ctor 参数,
t是不可见的。试试(val t: ...)(x: t.DependentType) -
@cchantep 添加
val似乎没有任何改变。 (我最初使用了一个案例类。)你的意思是让我也改变第二个参数列表吗?
标签: scala class scope implicit