【Flutter/Dart】TやS/E/Kとは?Generics(総称型)基礎

最終更新日

よくMapやSetに<T>や<S>がつく場合があります。これらはGenerics(総称型)といい予め格納する値の型を宣言(予約)しておくものです。

このページでは、Generics(総称型)の基礎について調べまとめてみました。

参考

  • 【参考】公式サイト
  • Generics(総称型)とは
    • 利用目的
      • 特定の型を記載せず総称型を仮置きし、後で決定する
    • メリット
      • 重複したコードを無くせる
      • 違う型の変数に代入すると、コンパイルエラーで教えてくれる
  • 実行環境
    • DartPadやAndroid Studio等で実行

Genericsとは

基本的な配列の型であるListのAPIドキュメンテーションを見ると、そこにはその型は実際はList<E>であることが判る。<…>記述はListは総称(或いはパラメタ化された)型、即ち正式の型パラメタたちを持っている型であることを示す。総称型の殆どの型パラメタは慣行的に E, T, S, K, 及び Vといった1文字の名前を持っている。

https://www.cresc.co.jp/tech/java/Google_Dart2/language/generics/generics.html

Genericsの効果

Genericsを使うメリットには

  1. 簡単に安全なコードを書ける
  2. 重複したコードを減らすことができる

です。

サンプル

サンプル①

void  main(){
var names = Map<String>();//GenericsにString型を指定
names.addAll(['Seth', 'Kathy', 'Lars']);//値を格納
names.add(42); // int型が追加されようとしているためエラー
}
解説

このサンプルではエラーが起きます。MapクラスにジェネリクスでStringを指定したのにint型を追加しようとしているためです。

サンプル②

class User<String> {
  final String Name;//型指定
  User(this.Name);
}

void main() {
  final user = User('Tanaka');//String型に文字列を代入
  print(user.Name);
}
解説

クラス・変数をString型に指定し、コンストラクタを使い生成したuserクラスにTanakaというStringのプロパティを追加しています。

参考

https://zenn.dev/iwaku/articles/2020-12-21-iwaku

https://www.google.com/search?q=Map%3Cint%2C+View%3E%E3%80%80dart&client=tablet-android-huawei&sxsrf=APq-WBtZFfj2khvcSJVVidkh0lCiJwdYsg%3A1649425406446&ei=_jtQYtjkGtj1-QaNwJXYAg&oq=Map%3Cint%2C+View%3E%E3%80%80dart&gs_lcp=ChNtb2JpbGUtZ3dzLXdpei1zZXJwEAM6BwgAEEcQsAM6BQghEKABOgQIIRAVSgQIQRgAUNIQWLs4YKBAaAFwAXgAgAGRAogB-AeSAQUwLjMuMpgBAKABAcgBCMABAQ&sclient=mobile-gws-wiz-serp

fem