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"は、「バッキングフィールド」と呼ばれるらしいです。

コメント