3

我正在尝试使用这种代码:

trait Outer {
  type Inner

  def f(x:Inner) : Void 
}

object test {
  def apply(o: Outer, i : Outer#Inner) : Void = 
    o.f(i)
}

我在最后一行出现错误:

类型不匹配; 找到:i.type(底层类型为 Outer#Inner) 需要:o.Inner

如果我将申请的签名更改为

def apply(o: Outer, i : o.Inner) : Void

然后我得到一个错误:

非法依赖方法类型

是否有可能让这段代码工作?

4

2 回答 2

5

您可以利用依赖于方法的类型(请参阅哪些是依赖方法类型的引人注目的用例?举例)。这将要求您使用 2 个参数列表:

trait Outer {
  type Inner
  def f(x:Inner): Unit 
}

object test {
  def apply( o: Outer )( i : o.Inner) { o.f(i) }
}
于 2013-05-30T10:45:55.167 回答
1

但 imoo.InnerOuter#Inner. 您能解释一下,使用前者而不是后者有什么意义?编译器只能进行静态检查,因此o.Inner应该等于o.type#Inner应该(静态)等于Outer#Inner。我错过了什么吗?

这就是原因。想象一下你有

class Outer1 extends Outer {
  type Inner = Int

  def apply(i: Int) { ... }
}

class Outer2 extends Outer {
  type Inner = String

  def apply(i: Int) { ... }
}

应该test.apply(new Outer1, "abc")编译吗?显然不是,因为它会调用Outer1.apply(String)不存在的 。但是,test.apply(new Outer1, 1)也不能编译(否则你会回到依赖于路径的类型)并且根本没有办法使用它apply

于 2013-05-31T19:07:01.813 回答