scala2.11编译器对lint的增强

scala2.11的编译器对lint也做了一些改善,对没有用的局部变量会给出警告,比如:

% cat /tmp/A.scala

object A{
    def foo() {
        val a = 2
        println("ok")
    }
}

% ./scalac -Xlint /tmp/A.scala

/tmp/A.scala:4: warning: local val in method foo is never used
val a = 2
    ^

对于类型推导方面,下面的情况也给出了合适的警告 (在2.10下lint不会警告)

% ./scala -Xlint

scala>  def mycons[B](x:B, xs:List[B]):List[B] = x :: xs

scala> mycons("hi", List(200))
<console>:9: warning: a type was inferred to be `Any`; this may indicate a programming error.
          mycons("hi", List(200))
                 ^
res0: List[Any] = List(hi, 200)

上面两个参数类型分别是StringList[Int],编译器为了能通过方法,在类型推导时把两个参数当成AnyList[Any]来对待,这有可能与实际预期不否,给出警告还是很有用的。

scala2.11编译器对lint的增强》上有3条评论

  1. dsibao

    类型推导方面,在 2.11.0 -M8版本,编译器不会给出警告
    scala> def mycons[B](x:B, xs:List[B]):List[B] = x:: xs
    mycons: [B](x: B, xs: List[B])List[B]

    scala> mycons(“hi”, List(200))
    res1: List[Any] = List(hi, 200)

    回复
    1. hongjiang 文章作者

      我用的是2.11.0-M7,还以外m8里又调整了,特意下载了M8测试了一下也是一样的。可能你启动REPL的时候没使用 -Xlint 参数?

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注