刀科の技術学習ブログ

アプリサイドから、web系フロント・バックとAWSによるインフラ領域へ学習を進めていきます。

【Android】javaからKotlinにコンバートした直後のエラー集

Kotlinに触ることになったので、コンバートで出くわしたエラー集をメモ代わりに記載。
随時追記していくので、増えたり訂正したりする可能性があります。

デバッグ実行時

2017/06/27 追記
デバッグ実行時にbreakで止めてる時に、ktコードだと変数ハイライトが見れない
(見れる方法はあるのだろうけど、そのままでは見れません)
watch変数なんかも名前入力しても見せてくれない。

staticなやつのアクセス

宴会の席にコンパニオンさんを呼んで、あげないといけないらしい。

class Hoge{
    public static void A(){
    }
}

こんな感じのjavaのクラスがいたとして、そのクラス関数Aを呼ぶところが、コンバートしたらエラーになったりします。

java:
Hoge.A();
Kotlin:
Hoge.Companion.A()

【クラス名】.Companion.【staticなやつ】とすればいいかも。変数なんかもこれ。

thisのアクセス

java

class Hoge{
    int a;
    public Hoge(int a){
        this.a = a;    //この部分
    }
}

これをkotlinで書くと、this@【クラス名】.アクセスしたいやつになるのでこんな感じ

this@Hoge.a = a

関数につけた変数でエラー

詳しい事はKotlinのドキュメントを呼んでもらうとして、
例のごとくjava例は下記。

public void ViewSetting(View view){}    //この関数を呼ぶ
java:
View v = findViewById(何かID);
ViewSetting(v);
Kotlin:
//Viewは取得済みと過程する コンバート時によしなになってるはずなので、ここでは言及しません
ViewSetting(v!!)

javaでは[View v]と定義した変数をViewSetting関数の引数に渡したいところなのですが、
コンバート結果次第ではありますが、関数定義側がnullを許容する定義になっているかどうかが原因です。

つまり、アプローチとしては関数定義を修正するか、渡す変数側の書き方を修正するかの2通りになります。
関数定義を修正する場合は、
ViewSetting(view: View) とするか、
ViewSetting(view: View?) のように型の後ろに?をつけて、nullを許容するかどうか指示する。

変数側で対処するなら、v!!のように後ろに!!がついてるやつは「nullだったら例外」とするものらしいです。
詳しくはKotlinのリファレンスとかを読もう。

カスタムViewクラスの定義の仕方でエラー

例えば、カスタムViewを作ったとして、それをどこかのレイアウトXMLなんかに配置して使うとする。
その場合はレイアウトリソースから生成された時のコンストラクタを書いておかないとエラーになる。
その時々で必要なコンストラクタは、プライマリでもセカンダリのコンストラクタでもOK。

レイアウトリソースから呼ばれるコンストラクタの書き方の参考に。

//プライマリコンストラクタも定義しているクラス
class HorizontalScrollRecycle(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : RecyclerView(context, attrs, defStyle){
    //レイアウトリソースから生成された時のための、セカンダリコンストラクタ. プライマリコンストラクタにリレーしてる
    constructor(context: Context, attrs: AttributeSet): this(context, attrs, 0){
    }

    init {
        //やりたい初期処理
        var manager: LinearLayoutManager = LinearLayoutManager(context)
        manager.orientation = LinearLayoutManager.HORIZONTAL
        layoutManager = manager
    }
}