Java → Kotlin
- 評価
- クリップ 0
- VIEW 1,255

退会済みユーザー
android studioで開発中のアプリをConvert Java File to Kotlin Fileで変換したところうまく動かなくなりました。
エラーが発生しているのはRetrofitで使うデータクラスの部分です。
Parcelableはプラグインを使って作成しました。
public class Comment implements Parcelable {
@Expose
private int id;
@Expose
private String userName;
@Expose
private String comment;
@Expose
private String datetime;
@Override
public String toString() {
return "Comment{" +
"id=" + id +
", userName='" + userName + '\'' +
", comment='" + comment + '\'' +
", datetime='" + datetime + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getDatetime() {
return datetime;
}
public void setDatetime(String datetime) {
this.datetime = datetime;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.userName);
dest.writeString(this.comment);
dest.writeString(this.datetime);
}
public Comment() {
}
protected Comment(Parcel in) {
this.id = in.readInt();
this.userName = in.readString();
this.comment = in.readString();
this.datetime = in.readString();
}
public static final Creator<Comment> CREATOR = new Creator<Comment>() {
@Override
public Comment createFromParcel(Parcel source) {
return new Comment(source);
}
@Override
public Comment[] newArray(int size) {
return new Comment[size];
}
};
}
これをConvert Java File to Kotlin Fileで変換すると赤波線が出ます。
上記のコードをKotlinで記述するにはどうすればいいのか教えてください。
変換後のコードは下記。
//Kotlin
class Comment : Parcelable {
@Expose
var id: Int = 0
@Expose
var userName: String? = null
@Expose
var comment: String? = null
@Expose
var datetime: String? = null
override fun toString(): String {
return "Comment{" +
"id=" + id +
", userName='" + userName + '\'' +
", comment='" + comment + '\'' +
", datetime='" + datetime + '\'' +
'}'
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeInt(this.id)
dest.writeString(this.userName)
dest.writeString(this.comment)
dest.writeString(this.datetime)
}
constructor() {}
protected constructor(`in`: Parcel) {
this.id = `in`.readInt()
this.userName = `in`.readString()
this.comment = `in`.readString()
this.datetime = `in`.readString()
}
companion object {
val CREATOR: Parcelable.Creator<Comment> = object : Parcelable.Creator<Comment> {
override fun createFromParcel(source: Parcel): Comment {
return Comment(source)
}
override fun newArray(size: Int): Array<Comment> {//<Comment?>にすると波線は消えますがうまく動きません
return arrayOfNulls(size)
}
}
}
}
エラーメッセージ
Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.example.myapplication.Commnet
意味が分からなかったらすみません。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
2つ問題があります。
- おっしゃるとおりメソッド
newArray
の戻り値の型がArray<Comment>
だとコンパイルが通りません。
arrayOfNulls(size)
により、要素がnull
な配列を返そうとしているので、戻り値の型としては、要素としてnull
を許容する配列Array<Comment?>
と指定してやる必要があります。 Parcelable
のルールに従えていない問題です。Javaで言うstaticな変数としてCREATOR
を提供する必要がありますが、Kotlinにはstaticという概念がありません。このギャップを埋めるために@JvmField
というアノテーションを付けます。
ずばり、コードはこうなります。
companion object {
@JvmField // ←これを付ける
val CREATOR: Parcelable.Creator<Comment> = object : Parcelable.Creator<Comment> {
override fun createFromParcel(source: Parcel): Comment {
return Comment(source)
}
override fun newArray(size: Int): Array<Comment?> { // Array<Comment?>と「?」を付ける
return arrayOfNulls(size)
}
}
}
手前味噌で恐縮ですがこちらのスライド、またはKotlinスタートブックのp.256で解説していますので、よかったらご覧になってみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/03/31 09:39
回答通り、@JvmFieldを付け加えるとうまく動くようになりました。
ありがとうございます。
もう一つのデータクラスでも同じエラーが出ていて@JvmFieldを付け加えても解決しませんでした。
もしよろしければ新しく質問しますので回答していただけると助かります。