scala2.7.7ではコンパイルが通るけれど、2.8.0RC1では通らないコード。

Scala2.8.0RC1 が出たので、早速ダウンロードして試してみました。
2.7.7でいくつか作ったプログラムがあるのでそれらをコンパイルしてみました。
ところが、いきなり最初に試したプログラムでコンパイルが通りませんでした。
以下はその問題が再現できる、なるべく短くしたコードです。

import java.awt.Image
import javax.swing.ImageIcon

class Mig01 {
    def getImage(fname:String):Image = {
        val url = getClass.getResource(fname)
        new ImageIcon(url).getImage
    }
    val BossLaser0Image:Image = getImage("resources/BossLaser0.png")
    val BossLaser1Image:Image = getImage("resources/BossLaser1.png")
    val BossLaser2Image:Image = getImage("resources/BossLaser2.png")
    val BossLaser3Image:Image = getImage("resources/BossLaser3.png")
    val BossLaser4Image:Image = getImage("resources/BossLaser4.png")

    def getImage(no:Int):Image = {
        Array(
            BossLaser0Image,
            BossLaser1Image,
            BossLaser2Image,
            BossLaser3Image,
            BossLaser4Image)(no+2)
    }

}
/*
c:\home\Scala\test\Mig01.scala:21: error: type mismatch;
 found   : Int
 required: scala.reflect.ClassManifest[java.awt.Image]
                        BossLaser4Image)(no+2)
                                           ^
c:\home\Scala\test\Mig01.scala:21: error: type mismatch;
 found   : Array[java.awt.Image]
 required: java.awt.Image
                        BossLaser4Image)(no+2)
                                        ^
two errors found

    以下のように文を分けると回避できました。
    val images = Array(
        BossLaser0Image,
        BossLaser1Image,
        BossLaser2Image,
        BossLaser3Image,
        BossLaser4Image)
    images(no+2)
*/

気を取り直して別のプログラムをコンパイルしてみました。
またコンパイルが通りませんでした。
これは原因や回避方法がよくわかりませんでした。

import scala.collection.mutable.ArrayBuffer

object Mig02 {
    val psqList = new ArrayBuffer[(Int, String, Int)]()
    psqList += (5, "A", 6)
}
/*
c:\home\Scala\test\Mig02.scala:5: error: type mismatch;
 found   : Int(5)
 required: (Int, String, Int)
        psqList += (5, "A", 6)
                    ^
one error found
*/

また、scala.ArrayクラスのsubArray()がなくなっています。
2.7.7ではdeprecatedだったけど、2.8.0ではバッサリ消えてます。
これは、2.7.7のjavadocにあるとおり、sliceメソッドに置き換えることで回避できます。

object Mig03 {
    val l = Array(3,1,4,1,5,9,2,6,5,3,5,8,9,7,9)
    println(l.subArray(3, 10))
}
/*
test\Mig03.scala:4: error: value subArray is not a member of Array[Int]
    println(l.subArray(3, 10))
              ^
one error found
*/

scala.swing.ComponentクラスのpaintComponentメソッドの引数の型が変わってます。
2.7.7では、java.awt.Graphicsでしたが、2.8.0ではjava.awt.Graphics2Dになっています。
回避方法としては、Graphics を Graphics2D にすればOKです。
ただし、この問題のマズイのは、2.7.7と2.8.0のどちらでもコンパイル可能なコードが
書けないことです。引数をどちらか一方の型にすると、もう一方でエラーになります。
両方書くとお互いに自分に合わない方でエラーになります。

import scala.swing.Component

object Mig04 extends Component {
    override def paintComponent(g:java.awt.Graphics):Unit = {
        g.setColor(java.awt.Color.RED)
        g.drawLine(10,10, 100, 100)
    }
}
/*
test\Mig04.scala:4: error: method paintComponent overrides nothing
        override def paintComponent(g:java.awt.Graphics):Unit = {
                     ^
one error found
*/