我用的 IDE 是 intellij 11 EAP,用 sbt-idea 把 idea project 設好後,把預設的 asset pa th 從 .idea_module 改成 src/main ,就可以開始開發了。
在開發上,除了前一回碰上的proguard問題外,我還碰上另一個比較嚴重的問題-不能在Scala裡寫 AsyncTask
這問題跟SI-3622 SI-3494有關,看來是在 Scala 2.8解掉的問題,2.9又跑回來了,我這邊看到的狀況是
override protected def doInBackground(params: Params*): Result
會被Scala compiler專換成
public Result doInBackground(Seq params) public Result doInBackground(Params[] params)
而底下的code,則是scala compiler會吐出 overides nothing.
override protected def doInBackground(params: Array[Params]): Result
不管怎樣,都跟Android要求的
protected Result doInBackground(Params[] params)
不同,所以在runtime時會跑出NoSuchMethodError.解決方法是在 java 裡寫個 bridge interface ,幫 scala compiler 搞不定的東西,在這個 interface 裡定意好
public abstract class SAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { protected abstract Result doInBackground(Seq<Params> params); @Override protected Result doInBackground(Params... paramses) { return doInBackground(JavaConversions.asScalaBuffer(Arrays.asList(paramses))); } }
多補幾個有關repeated parameters的討論,看來是Spec本身有問題,然後實作時一改再改,一路從2.7開始修修補補過來
ReplyDeletehttps://issues.scala-lang.org/browse/SI-1342
https://issues.scala-lang.org/browse/SI-1459
http://stackoverflow.com/questions/5512402/overriding-a-repeated-class-parameter-in-scala