Scala &引用;结构精化中的参数类型不能引用在该精化之外定义的抽象类型;
当我编译时:Scala &引用;结构精化中的参数类型不能引用在该精化之外定义的抽象类型;,scala,Scala,当我编译时: object Test extends App { implicit def pimp[V](xs: Seq[V]) = new { def dummy(x: V) = x } }
object Test extends App {
implicit def pimp[V](xs: Seq[V]) = new {
def dummy(x: V) = x
}
}
我得到:
$ fsc -d aoeu go.scala
go.scala:3: error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
def dummy(x: V) = x
^
one error found
为什么?
(并没有真正回答这个问题。)在发布此消息后不久就发现了问题:我必须定义一个命名类,而不是使用匿名类。(不过,我还是希望能听到更好的解释。)
有效。规范不允许使用。参见3.2.7化合物类型 在结构元素中的方法声明中,任何值参数的类型只能指元素中包含的类型参数或抽象类型。也就是说,它必须引用方法的类型参数 本身,或企业内部的类型定义。此限制不适用 函数的结果类型 在修复之前,编译器会编译这个,并且您会得到一个在运行时找不到的方法。这是固定的,这就是为什么你得到这个美妙的信息 那么,问题是,为什么不允许这样做 这是2007年scala邮件列表中Gilles Dubochet的一篇文章。这大致归结为这样一个事实:结构类型使用反射,如果它使用在细化之外定义的类型,编译器不知道如何查找要调用的方法(编译器不知道如何提前填充
p.getClass.getMethod(“pimp”,Array(?))
但是去看看这篇文章,它会回答你的问题和更多的问题
编辑:
你好名单
我尝试在函数中用抽象数据类型定义结构类型
有什么原因吗
我听说了两个关于结构类型的问题
Scala 2.6最近的扩展,我想在这里回答
def(p:{defx(q:Int):Int})=p.x(4)
将被重写
例如:
def f(p: Object) = p.getClass.getMethod("x", Array(Int)).invoke(p, Array(4))
现在是答案
def f(p: Object) = p.getClass.getMethod("x", Array(Int)).invoke(p, Array(4))