LoginSignup
7
5

More than 5 years have passed since last update.

Kotlinでジェネリクス、基本から応用-クラス定義からメソッド、多重実装まで-

Last updated at Posted at 2018-03-04

はじめに

Kotlinでアプリを作ろう!と思い開始したのですが、Utilやhelperを作るためにジェネリクスと戯れていたら一日が終わっていました。
まだあまりKotlinのジェネリクスの記事が無いようなので、調べたり試したりした内容を記そうと思います。
適当な感じでjavaとの例で比較します。
こういうのもあるよ!というのがあれば教えていただければと思います。

基本

クラス・メソッドのジェネリクス

javaと変わらない

java
public abstract class Sample<T> {
    abstract T create();

    abstract void parameter(List<T> list, T t);
}
kotlin
abstract class Sample<T> {
    abstract fun create(): T

    abstract fun parameter(list: List<T>, t: T)
}

staticメソッド

companion objectのメソッドの中でジェネリクスを使う

java
class Smaple{
    public static <T> void sampleMethod(List<T> tList) {
    }
}
kotlin
class Sample {
    companion object {
        fun <T> sampleMethod(tList: List<T>) {
        }
    }
}

継承や実装制約を付ける場合

継承と同じように、「:」を利用する。
クラスとstaticメソッド両方一緒に記載。

java
public class Sample<T extends View> {
    public static <L extends View.OnClickListener> void setListener(L l){
    } 
}

kotlin
class Sample<T : View> {
    companion object {
        fun <L : View.OnClickListener> setListener(l: L) {
        }
    }
}

応用

多重実装

where句を利用する

java
public class Sample<T extends View & View.OnClickListener> {
    public static <L extends View & View.OnClickListener> void setListener(L l) {
    }
}
kotlin
class Sample<T> where T : View, T : View.OnClickListener {
    companion object {
        fun <L> setListener(l: L) where L : View, L : View.OnClickListener {
        }
    }
}

ちなみに、下のようにも書けるが、警告が出る

kotlin
class Sample<T : View> where T : View.OnClickListener {
    companion object {
        fun <L : View> setListener(l: L) where L : View.OnClickListener {
        }
    }
}

if a type parameter has multiple constraints, they all need to be replaced in the 'where' clause.
型パラメータに複数の制約がある場合、それらはすべて 'where'句で置き換える必要があります。

一つの場合でもwhere句は利用可能

継承や実装制約を付ける場合での例をwhereで書く。

kotlin
class Sample<T> where T: View {
    companion object {
        fun <L> setListener(l: L) where L : View.OnClickListener {
        }
    }
}

一つの場合は「:」の方が分かりやすそうだが、クラスやインターフェース名が長い場合はいいのかも。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5