Scala类型推断的差异,Eclipse与Maven

时间:2010-11-14 13:22:40

标签: eclipse scala maven

我使用Maven Scala插件获得编译失败,我没有使用Eclipse Scala IDE。首先是代码:

package com.example

trait SomeTrait[OUTPUT, INPUT] {
    def apply(request: INPUT, f: OUTPUT => Unit);
}

class  SomeClass extends SomeTrait[String,String] {
    def apply(request, f) {
        f.apply(request.toUpperCase())
    }
}

object App extends Application {
  override def main(args: Array[String]) {
      new SomeClass()("test", (value) => { println(value)})
  }
}

Eclipse Scala IDE很好但是Maven给了我这个错误:

[ERROR] .../src/main/scala/com/example/App.scala:8: 
    error: ':' expected but ',' found.
[INFO]     def apply(request, f) {
[INFO]                      ^
[ERROR] .../src/main/scala/com/example/App.scala:11: 
    error: identifier expected but '}' found.
[INFO] }

如果我指定类型,如:

class  SomeClass extends SomeTrait[String,String] {
    def apply(request: String, f: String => Unit) {
        f.apply(request.toUpperCase())
    }
}

它汇编在两者中。

版本等。:

Scala version: 2.8.1
Scala IDE for Eclipse: 1.0.0.201011130651
Maven: 3.0
Maven Scala Plugin: 2.15.0
Java: 1.6.0_17

2 个答案:

答案 0 :(得分:4)

Eclipse在这里是错误的...你应该看到与命令行情况相同的编译时错误。

令人费解的是,Eclipse中嵌入的Scala编译器(只是在增量编译模式下运行的scalac 2.8.1.final)正在成功编译您最初提供的源,并推断出您想要的参数类型。 ..生成类文件,在二进制输出中,SomeClass.apply具有您期望的签名。

这不应该发生。

更新:

正如Paul所说,IDE的行为就像启用了-infer-argument-types一样。它的行为就像启用了-Ydependent-method-types。这表明-Xexperimental选项背后的新逻辑存在一些问题,当编译器设置实例以IDE的方式创建时,它会显示出来。

答案 1 :(得分:2)

你在任何地方使用-Yinfer-argument-types。