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 */