質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1876閲覧

Java → Kotlin

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2017/03/30 08:11

編集2017/03/30 08:41

android studioで開発中のアプリをConvert Java File to Kotlin Fileで変換したところうまく動かなくなりました。
エラーが発生しているのはRetrofitで使うデータクラスの部分です。
Parcelableはプラグインを使って作成しました。

Java

1public class Comment implements Parcelable { 2 @Expose 3 private int id; 4 @Expose 5 private String userName; 6 @Expose 7 private String comment; 8 @Expose 9 private String datetime; 10 11 @Override 12 public String toString() { 13 return "Comment{" + 14 "id=" + id + 15 ", userName='" + userName + '\'' + 16 ", comment='" + comment + '\'' + 17 ", datetime='" + datetime + '\'' + 18 '}'; 19 } 20 21 public int getId() { 22 return id; 23 } 24 25 public void setId(int id) { 26 this.id = id; 27 } 28 29 public String getUserName() { 30 return userName; 31 } 32 33 public void setUserName(String userName) { 34 this.userName = userName; 35 } 36 37 public String getComment() { 38 return comment; 39 } 40 41 public void setComment(String comment) { 42 this.comment = comment; 43 } 44 45 public String getDatetime() { 46 return datetime; 47 } 48 49 public void setDatetime(String datetime) { 50 this.datetime = datetime; 51 } 52 53 @Override 54 public int describeContents() { 55 return 0; 56 } 57 58 @Override 59 public void writeToParcel(Parcel dest, int flags) { 60 dest.writeInt(this.id); 61 dest.writeString(this.userName); 62 dest.writeString(this.comment); 63 dest.writeString(this.datetime); 64 } 65 66 public Comment() { 67 } 68 69 protected Comment(Parcel in) { 70 this.id = in.readInt(); 71 this.userName = in.readString(); 72 this.comment = in.readString(); 73 this.datetime = in.readString(); 74 } 75 76 public static final Creator<Comment> CREATOR = new Creator<Comment>() { 77 @Override 78 public Comment createFromParcel(Parcel source) { 79 return new Comment(source); 80 } 81 82 @Override 83 public Comment[] newArray(int size) { 84 return new Comment[size]; 85 } 86 }; 87}

これをConvert Java File to Kotlin Fileで変換すると赤波線が出ます。
上記のコードをKotlinで記述するにはどうすればいいのか教えてください。
変換後のコードは下記。

Kotlin

1//Kotlin 2class Comment : Parcelable { 3 @Expose 4 var id: Int = 0 5 @Expose 6 var userName: String? = null 7 @Expose 8 var comment: String? = null 9 @Expose 10 var datetime: String? = null 11 12 override fun toString(): String { 13 return "Comment{" + 14 "id=" + id + 15 ", userName='" + userName + '\'' + 16 ", comment='" + comment + '\'' + 17 ", datetime='" + datetime + '\'' + 18 '}' 19 } 20 21 override fun describeContents(): Int { 22 return 0 23 } 24 25 override fun writeToParcel(dest: Parcel, flags: Int) { 26 dest.writeInt(this.id) 27 dest.writeString(this.userName) 28 dest.writeString(this.comment) 29 dest.writeString(this.datetime) 30 } 31 32 constructor() {} 33 34 protected constructor(`in`: Parcel) { 35 this.id = `in`.readInt() 36 this.userName = `in`.readString() 37 this.comment = `in`.readString() 38 this.datetime = `in`.readString() 39 } 40 41 companion object { 42 43 val CREATOR: Parcelable.Creator<Comment> = object : Parcelable.Creator<Comment> { 44 override fun createFromParcel(source: Parcel): Comment { 45 return Comment(source) 46 } 47 48 override fun newArray(size: Int): Array<Comment> {//<Comment?>にすると波線は消えますがうまく動きません 49 return arrayOfNulls(size) 50 } 51 } 52 } 53}

エラーメッセージ
Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.example.myapplication.Commnet
意味が分からなかったらすみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2つ問題があります。

  1. おっしゃるとおりメソッドnewArrayの戻り値の型がArray<Comment>だとコンパイルが通りません。

arrayOfNulls(size)により、要素がnullな配列を返そうとしているので、戻り値の型としては、要素としてnullを許容する配列Array<Comment?>と指定してやる必要があります。
2. Parcelableのルールに従えていない問題です。Javaで言うstaticな変数としてCREATORを提供する必要がありますが、Kotlinにはstaticという概念がありません。このギャップを埋めるために@JvmFieldというアノテーションを付けます。

ずばり、コードはこうなります。

kotlin

1companion object { 2 3 @JvmField // ←これを付ける 4 val CREATOR: Parcelable.Creator<Comment> = object : Parcelable.Creator<Comment> { 5 override fun createFromParcel(source: Parcel): Comment { 6 return Comment(source) 7 } 8 9 override fun newArray(size: Int): Array<Comment?> { // Array<Comment?>と「?」を付ける 10 return arrayOfNulls(size) 11 } 12 } 13 }

手前味噌で恐縮ですがこちらのスライド、またはKotlinスタートブックのp.256で解説していますので、よかったらご覧になってみてください。

投稿2017/03/30 10:18

taro

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/31 00:39

一昨日「Kotlinスタートブック」は購入させていただきました。まさかその本の著者から回答いただけるとは思っておらずビックリしています。 回答通り、@JvmFieldを付け加えるとうまく動くようになりました。 ありがとうございます。 もう一つのデータクラスでも同じエラーが出ていて@JvmFieldを付け加えても解決しませんでした。 もしよろしければ新しく質問しますので回答していただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問