[Kotlin]Javaでクラス継承とインタフェースしたクラスをコンバートした際の注意

スポンサーリンク

Javaでクラス継承、かつ、インターフェース実装するクラスを書いているファイルをコンバート(Android Studioで[Code]→[Convert Java File to Kotlin File])した際に対応にハマったので、対策内容を残しておきます。

状況

  • Javaで書かれた既存のコードを、えいやとKotlinに変換したときの話
  • インターフェースの一部が、継承したクラス内で実装されていた。
  • Kotlinへの変換では、getterなどはプロパティのように変換される
    例:getName() → name

コード

コンバート前のJavaコード

自作Interface:IViewFinder.java

public interface IViewFinder {
    Rect getFramingRect();
    int getWidth();
    int getHeight();
}

自作Viewクラス:ViewFinderView.java
※「extends View」は{@link android.view.View}
※自作InterfaceのIViewFinderをimplementsしています。

public class ViewFinderView extends View implements IViewFinder {
    private Rect mFramingRect;
・・・
    public Rect getFramingRect() {
        return mFramingRect;
    }
・・・

※getWidth()、getHeight()は、android.view.Viewに定義されているためこちらには記載されていない。

コンバート後のKotlinコード

コンバート後、そのままではビルドができません。

IViewFinder.kt

public interface IViewFinder {
    val framingRect: Rect?
    val width: Int
    val height: Int
・・・
}

ViewFinderView.kt
※「extends View」は{@link android.view.View}

class ViewFinderView : View, IViewFinder {
    override var framingRect: Rect? = null public get() {
        return field
    }
        private set
・・・

framingRectの定義周りでエラーが表示されている。

また、以下のエラーメッセージも表示されている。

Class ‘ViewFinderView’ is not abstract and does not implement abstract member public abstract val width: Int defined in me.dm7.barcodescanner.core.IViewFinder

対応方法

Interfaceで定義したwidth、heightが実装されていないので対応する

javaでは、getWidth()で定義して、android.view.View内で実装していた。
widthに変換されたことで、実装がなくなった。

→実装がJava側なので、合わせてgetWidth()、getHheight()のままにして使う。
もしかしたらより適切な方法があるかも知れないです。

getFramingRectの定義周りのエラーを修正する

class ViewFinderView : View, IViewFinder {
    override var framingRect: Rect? = null

他の実装にもよるかもですが、get() {return field} は不要な認識。
この"field"は、「バッキングフィールド」と呼ばれるらしいです。

参考

https://qiita.com/tkhs0604/items/a3384f693eedbb5bd3e6

コメント

タイトルとURLをコピーしました