LoginSignup
2
0

More than 5 years have passed since last update.

javaをKotlinに変換したときにしたこと

Last updated at Posted at 2018-09-02

概要

Inttellijの機能でJavaからKotlinに変換したときに出てたエラーを解決した方法を殴り書きしてる。後でちゃんと整理するかもしれない。
Kotlin初心者でとりあえずエラー消しただけなのでプログラム的に悪い書き方になってるところはありそう。もっといい解決方法あったら教えてください。

事例

ジェネリクスがある場合絶対つけないといけない

とりあえず全部<*>つけた

before
var controller: Controller
after
var controller: Controller<*>

ジェネリクスを<*>にするとジェネリクスを引数に取るメソッドでエラーが出る。

<*>は<out Any>の略記らしく、outはジェネリクスを戻り値にしか使わないという制限らしくそれに引っかかる。
このあたりはJavaとのジェネリクスの相違が大きく出てて思考停止で解決できなかった。
とりあえずプログラム見て<*>以外のやつ入れるしかなかった。kotlinのジェネリクスよくわからない。

before
var controller: Controller
after
var controller: Controller<Data>

循環ジェネリクスを持てない

今回は無駄についてただけだったので片一方を消して解決した。
新しく別のタイプ作って無理やり解決する方法とか載ってたけど、言語的には多分循環するジェネリクスなんてつくるなってことかな。

ゲッター・セッター

変換で勝手に消えてた。
Kotlinではそのままフィールドにアクセスするように書く。
可視性はprivate setとかを宣言すれば読み取り限定とかできるっぽい。

before
game.getFinishStatus()
after
game.finishStatus
before
game.setFinishStatus(FinishStatus(true))
after
game.finishStatus=FinishStatus(true)

オーバーライド

overrideしたメソッドにはoverride修飾子をつけないといけない。だいたい自動でつけてくれるんだけど、一部つけてくれないやつがあった。toStringとかのObjectのメソッドオーバーライドは自動でつけてくれない?
自作クラスのやつでもつけられてないやつもあった。よくわからない。

before
    fun toString(): String {
        return text
    }
after
    override fun toString(): String {
        return text
    }

listのadd

Kotlinのデフォルトのリストは要素の追加削除ができない。JavaでListで宣言してるとデフォルトのリストに変換されるのでaddがつかえなくなる。宣言をMutableListに書き換える。

before
private var commandList: List<IN>? = null
commandList!!.add(command)//エラー
after
private var commandList: MutableList<IN>? = null
commandList!!.add(command)//エラー出ない

listのremove

引数がインデックスのやつはremoveAt

before
shapeList.remove(0)
after
shapeList.removeAt(0)

キャスト

なぜか消えてた。安全なキャストをしてる場合はキャスト消しても問題ないらしいけど、エラー出てるところがあった。もしかしたらジェネリクスをつかったキャストだったからかもしれない。

before
cd//もとは(IN)cd //INはジェネリクス
after
cd as IN

可変長引数の代入

可変長引数と普通に宣言した配列で型がちがうので代入できない。可変長引数から新しく配列作って代入。

before
class ControllerGroup(vararg controllers: Controller<*>) {
    private val controllers: Array<Controller<*>>
    init {
        this.controllers = controllers
    }
}
after
class ControllerGroup(vararg controllers: Controller<*>) {
    private val controllers: Array<Controller<*>>
    init {
        this.controllers = arrayOf(*controllers)
    }
}

メソッドの引数のNullチェック

Nullチェック関連はだいたい自動でやってくれるんだけど、メソッドの引数はやってくれないっぽい?

before
        game.addShape(shape)//Shape?だからだめって言われる
after
        game.addShape(shape!!)

あとで初期化する配列

最初にNullで埋めてあとから値を入れる配列(結果的にNullは入らない)をNullチェックから外したいとき。Arrays.fillとか使ってる場合。Arrayの初期化時に入れる

before
val results = arrayOfNulls<RPSResult>(3)
Arrays.fill(results,RPSResult.DRAW)
after
val results = Array<RPSResult>(3,{RPSResult.DRAW})

static import

どうもstatic importでクラス名をつけずにstaticメソッドを呼べないらしい。

before
import game.rps.shape.Shape.*
///////////////////////////////
val results = judgeAll(SCISSOR, SCISSOR, SCISSOR, SCISSOR)
after
val results = Shape.judgeAll(SCISSOR, SCISSOR, SCISSOR, SCISSOR)

nullがはいらないけど後で初期化するやつ

lateinit修飾子つける

before
private var currentShape: Array<Shape?>
after
private lateinit var currentShape: Array<Shape?>

可変長引数に直接配列入れる

先頭に*つける

before
 Shape.judgeAll(currentShapes)
after
 Shape.judgeAll(*currentShapes)

toArray

toTypedArray

before
currentList.toArray(arrayOfNulls<Shape>(currentList.size))
after
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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0