Android: ジェネリクス学習用アプリ開発

作成したアプリ

 - ジェネリクスを使った一つのメソッドを経由してString、Int、Boolean型の値をそれぞれ表示させるサンプルアプリ

f:id:yyuyakun:20220129164141p:plain

ジェネリクスとは?

 - <>を使って仮の型で定義できる仕組み。仮の型のパラメータにはV(value)やK(key)などの略語が使われることが多く、<V> や <K> などの形でコード内で使われる。

 

ジェネリクスのメリットは?

 - 引数や戻り値の型が違うが同じ処理を行うメソッドがある場合、ジェネリクスを使って仮の型で定義すると、実際に使う時に色々な型に変更して一つのメソッドでいろいろな型の引数や戻り値を扱えるメリットがある

 

実装詳細

- ジェネリクスを使ったメソッド定義

 今回はジェネリクスの型が適切に変更されているか確認したいだけの為、ただ値が通過するだけのメソッドを作成。

package com.example.samplegenericsapplication

class SampleGenerics {

// 値を受け取り何もせず値を返す
// 一つのVが変更されると連動して全てのVが選択した型に変更される
fun <V>viaValue(value: V): V {
return value
}

}

 

 - 定義したジェネリクスメソッドを使用

 今回色々な型にジェネリクスメソッドが変更されるのか確認したいため、String、Int、Booleanの値を使用して確認。

package com.example.samplegenericsapplication

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment

class MainFragment : Fragment() {

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_main, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val sampleGenerics = SampleGenerics()

// Stringの場合
val stringValueText = view.findViewById<TextView>(R.id.stringValue)
// String型の値を代入
val stringValue = sampleGenerics.viaValue<String>("ゆやまる")

stringValueText.text = stringValue

// Intの場合
val intValueText = view.findViewById<TextView>(R.id.intValue)
// Int型の値を代入
val intValue = sampleGenerics.viaValue<Int>(3)
intValueText.text = intValue.toString()

// Booleanの場合
val booleanValueText = view.findViewById<TextView>(R.id.booleanValue)
// Boolean型の値を代入
val booleanValue = sampleGenerics.viaValue<Boolean>(true)
booleanValueText.text = booleanValue.toString()
}
}

上記コードではジェネリクスに対して直接型指定をしているが、型推論の機能があるため直接指定しなくても良い(例↓)

// String型の値を代入(型推論でString型と判断される)
val stringValue = sampleGenerics.viaValue("ゆやまる")