概要
Inttellijの機能でJavaからKotlinに変換したときに出てたエラーを解決した方法を殴り書きしてる。後でちゃんと整理するかもしれない。
Kotlin初心者でとりあえずエラー消しただけなのでプログラム的に悪い書き方になってるところはありそう。もっといい解決方法あったら教えてください。
事例
ジェネリクスがある場合絶対つけないといけない
とりあえず全部<*>つけた
var controller: Controller
var controller: Controller<*>
ジェネリクスを<*>にするとジェネリクスを引数に取るメソッドでエラーが出る。
<\*>は\の略記らしく、outはジェネリクスを戻り値にしか使わないという制限らしくそれに引っかかる。
このあたりはJavaとのジェネリクスの相違が大きく出てて思考停止で解決できなかった。
とりあえずプログラム見て<*>以外のやつ入れるしかなかった。kotlinのジェネリクスよくわからない。
var controller: Controller
var controller: Controller<Data>
循環ジェネリクスを持てない
今回は無駄についてただけだったので片一方を消して解決した。
新しく別のタイプ作って無理やり解決する方法とか載ってたけど、言語的には多分循環するジェネリクスなんてつくるなってことかな。
ゲッター・セッター
変換で勝手に消えてた。
Kotlinではそのままフィールドにアクセスするように書く。
可視性はprivate setとかを宣言すれば読み取り限定とかできるっぽい。
game.getFinishStatus()
game.finishStatus
game.setFinishStatus(FinishStatus(true))
game.finishStatus=FinishStatus(true)
オーバーライド
overrideしたメソッドにはoverride修飾子をつけないといけない。だいたい自動でつけてくれるんだけど、一部つけてくれないやつがあった。toStringとかのObjectのメソッドオーバーライドは自動でつけてくれない?
自作クラスのやつでもつけられてないやつもあった。よくわからない。
fun toString(): String {
return text
}
override fun toString(): String {
return text
}
listのadd
Kotlinのデフォルトのリストは要素の追加削除ができない。JavaでListで宣言してるとデフォルトのリストに変換されるのでaddがつかえなくなる。宣言をMutableListに書き換える。
private var commandList: List<IN>? = null
commandList!!.add(command)//エラー
private var commandList: MutableList<IN>? = null
commandList!!.add(command)//エラー出ない
listのremove
引数がインデックスのやつはremoveAt
shapeList.remove(0)
shapeList.removeAt(0)
キャスト
なぜか消えてた。安全なキャストをしてる場合はキャスト消しても問題ないらしいけど、エラー出てるところがあった。もしかしたらジェネリクスをつかったキャストだったからかもしれない。
cd//もとは(IN)cd //INはジェネリクス
cd as IN
可変長引数の代入
可変長引数と普通に宣言した配列で型がちがうので代入できない。可変長引数から新しく配列作って代入。
class ControllerGroup(vararg controllers: Controller<*>) {
private val controllers: Array<Controller<*>>
init {
this.controllers = controllers
}
}
class ControllerGroup(vararg controllers: Controller<*>) {
private val controllers: Array<Controller<*>>
init {
this.controllers = arrayOf(*controllers)
}
}
メソッドの引数のNullチェック
Nullチェック関連はだいたい自動でやってくれるんだけど、メソッドの引数はやってくれないっぽい?
game.addShape(shape)//Shape?だからだめって言われる
game.addShape(shape!!)
あとで初期化する配列
最初にNullで埋めてあとから値を入れる配列(結果的にNullは入らない)をNullチェックから外したいとき。Arrays.fillとか使ってる場合。Arrayの初期化時に入れる
val results = arrayOfNulls<RPSResult>(3)
Arrays.fill(results,RPSResult.DRAW)
val results = Array<RPSResult>(3,{RPSResult.DRAW})
static import
どうもstatic importでクラス名をつけずにstaticメソッドを呼べないらしい。
import game.rps.shape.Shape.*
///////////////////////////////
val results = judgeAll(SCISSOR, SCISSOR, SCISSOR, SCISSOR)
val results = Shape.judgeAll(SCISSOR, SCISSOR, SCISSOR, SCISSOR)
nullがはいらないけど後で初期化するやつ
lateinit修飾子つける
private var currentShape: Array<Shape?>
private lateinit var currentShape: Array<Shape?>
可変長引数に直接配列入れる
先頭に*つける
Shape.judgeAll(currentShapes)
Shape.judgeAll(*currentShapes)
toArray
toTypedArray
currentList.toArray(arrayOfNulls<Shape>(currentList.size))
currentList.toTypedArray()
参考
とりあえずみたやつ全部あげてるからここに書いた情報と全く関係ないのも入ってるし、絶対いくつか入れ忘れてる。
https://qiita.com/k5n/items/c8bf7a507b64f20eebd0
https://qiita.com/tasogarei/items/266ecf02576d48fc69f6
https://stackoverflow.com/questions/46682455/how-to-solve-violation-of-finite-bound-restriction-in-kotlin
https://qiita.com/ssuzaki/items/8a550fca6775c1e6e147
https://qiita.com/k5n/items/18adb5c3503a54e96c22
https://qiita.com/ke__kyukyun1828/items/3832d0bf42e6f7ef150a
https://qiita.com/koher/items/d9411a00986f14683a3f
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/packages.html
https://qiita.com/k5n/items/cc0377b75d8537ef8a85