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の定義周りでエラーが表示されている。
また、以下のエラーメッセージも表示されている。
対応方法
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"は、「バッキングフィールド」と呼ばれるらしいです。
コメント