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

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

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

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

Kotlin

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

Q&A

解決済

1回答

2999閲覧

Kotlin ジェネリクスを使ったコードのエラーについて

yoppy0066

総合スコア293

Android

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

Kotlin

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

0グッド

0クリップ

投稿2019/02/09 13:34

https://nulab.com/ja/blog/backlog/retrofit2-backlog-api/
こちらのページに以下のようなサンプルコードがあるのですが、以下のようなエラーとなります

object RetrofitServiceGenerator { ・・・ // エラー : One type argument expected for class Class<T : Any!> // エラー : Unresolved reference: T fun createServiceFor(serviceClass: Class): T { return retrofit.create(serviceClass) } // エラー : Unresolved reference: T inline fun createService(): T { return createServiceFor(T::class.java) } }

Tがどこにも定義されていないためと思い、以下のように修正してみたのですが以下の部分のエラーが解消しません。

object RetrofitServiceGenerator { ・・・ // エラー : One type argument expected for class Class<T : Any!> fun <T>createServiceFor(serviceClass: Class): T { return retrofit.create(serviceClass) } inline fun <T>createService(): T { return createServiceFor(T::class.java) } }

こちらのエラーの意味と解決方法がご教授いただけないでしょうか。
また、funcの後ろに<T>を追加したのですがこちらの修正は意味的に正しいでしょうか?

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

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

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

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

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

jimbe

2019/02/09 16:55

そのエラーの発生箇所はその行でしょうか, それともそのメソッドを呼んでいる方でしょうか. エラーメッセージをコメント化せず, 元のまま提示頂いたほうが良いかと思います. エラーメッセージに発生箇所の行番号がありましたら, その周辺の含めて行番号が分かるようにしていただけると, より分かりやすいかと思います.
keicha_hrs

2019/02/10 00:43

参考にされたページにあるコードは「これで全部」ではなく部分的なものなのではありませんか?完結させなければ問題の評価などもできないのではと思えます。あと、Javaのジェネリクス(総称型)とか、仮引数型とか実引数型といった概念はご承知されていますか?その知識が無ければなかなか読み解けないと思います。
yoppy0066

2019/02/11 13:01

ご確認ありがとうございます。 コードの一部分かどうかは私には判断しかねるのですが、掲載されているコードをみる限りTがどこにも定義されていないため一部のコードなのかもしれません... ジェネリクスについては理解が深くないので調べながらやっているのですが クラスに<T>をつけようとしたところobjectにはつけられないようで、手詰まり状態となっております...
jimbe

2019/02/11 15:38 編集

オブジェクト式/オブジェクト宣言についてはご理解頂けているのでしょうか.
guest

回答1

0

ベストアンサー

元記事の方は妙なスペースが空いているので、型パラメータのところがXMLタグか何かとして解釈され省略されてしまっているようですね。

Kotlinではreifiedキーワードを付けることで型パラメータの具体型にアクセスできます。
https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters

よって、元記事のコードは正しくは以下のようになると思います。

kotlin

1fun <T> createServiceFor(serviceClass: Class<T>): T { 2 return retrofit.create(serviceClass) 3} 4 5inline fun <reified T> createService(): T { 6 return createServiceFor(T::class.java) 7}

投稿2019/02/13 09:38

kakajika

総合スコア3131

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

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

yoppy0066

2019/02/13 10:07

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問