Dartについて学んでみる④

## ジェネリクスとは?
ジェネリクスは総称型とも呼ばれる。
静的型付け言語で、Listなどのコンテナ型のオブジェクトに対してメソッドを定義する際に役に立つ機能だそうです。

例えば、Listに対して任意の処理を行う関数を実装する場合、Listの要素の型ごとに関数を実装するのは無駄が多いらしい?
まだよく分かってない???

公式のドキュメント
https://dart.dev/guides/language/type-system

## 解説を翻訳をしてみた

## ダート型システム
コンテンツ
健全性とは何ですか？
健全性のメリット
静的分析に合格するためのヒント
メソッドをオーバーライドするときにサウンドリターンタイプを使用する
メソッドをオーバーライドするときにサウンドパラメータタイプを使用する
動的リストを型付きリストとして使用しないでください
ランタイムチェック
型推論
フィールドとメソッドの推論
静的フィールド推論
ローカル変数の推論
タイプ引数の推論
タイプの置き換え
単純な型指定
ジェネリック型の割り当て
メソッド
その他のリソース
Dart言語はタイプセーフです。静的タイプチェックとランタイムチェックの組み合わせを使用して、変数の値が常に変数の静的タイプと一致するようにします。これは、サウンドタイピングと呼ばれることもあります。型は必須ですが、型推論のため、型注釈はオプションです。

タイプを含むDart言語の完全な紹介については、 言語ツアーを参照してください。

静的型チェックの利点の1つは、Dartの静的アナライザーを使用してコンパイル時にバグを見つけることができることです。

ジェネリッククラスに型アノテーションを追加することで、ほとんどの静的分析エラーを修正できます。最も一般的な汎用クラスは、コレクションタイプ List<T>とMap<K,V>です。

たとえば、次のコードでは、printInts()関数は整数リストを出力し、main()リストを作成してをに渡しますprintInts()。



**悪い例**
```dart
void printInts(List<int> a) => print(a);

void main() {
  final list = [];
  list.add(1);
  list.add('2');
  printInts(list);
}
```

上記のコードは、 ：listの呼び出しで（上記で強調表示されている）タイプエラーになります。printInts(list)

error - The argument type 'List<dynamic>' can't be assigned to the parameter type 'List<int>'. - argument_type_not_assignable

![スクリーンショット 2022-04-02 10.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/4aac510e-4f30-b85a-a5fa-38c6dcc61c37.png)

List<dynamic>このエラーは、からへの不健全な暗黙のキャストを強調していList<int>ます。list変数の静的タイプはList<dynamic>です。これは、初期化宣言var list = []が、より具体的な型引数を推測するのに十分な情報をアナライザーに提供しないためですdynamic。このprintInts()関数はタイプのパラメーターを予期しているため、List<int>タイプの不一致が発生します。

リストの作成時に型注釈（<int>）を追加すると（以下で強調表示）、アナライザーは文字列引数をパラメーターに割り当てることができないと文句を言いintます。結果の引用符を削除するlist.add('2')と、静的分析に合格し、エラーや警告なしで実行されるコードになります。

**良い例**
```dart
void printInts(List<int> a) => print(a);

void main() {
  final list = <int>[];
  list.add(1);
  list.add(2);
  printInts(list);
}
```
![スクリーンショット 2022-04-02 10.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/dc2ecf72-e536-70b7-b82a-26a39896bd4f.png)

## 健全性とは何ですか？
健全性とは、プログラムが特定の無効な状態にならないようにすることです。サウンド型システムとは、式が式の静的型と一致しない値に評価される状態になることは決してないことを意味します。たとえば、式の静的型がStringである場合、実行時に文字列を評価するときにのみ文字列を取得することが保証されます。

JavaやC＃の型システムのように、Dartの型システムは健全です。静的チェック（コンパイル時エラー）と実行時チェックの組み合わせを使用して、その健全性を強制します。たとえば、にを割り当てるString とint、コンパイル時エラーになります。Stringオブジェクトがを使用していない場合、オブジェクトをusing にキャストするas Stringと、ランタイムエラーが発生して失敗しますString。

## 健全性のメリット
サウンドタイプシステムにはいくつかの利点があります。

コンパイル時に型関連のバグを明らかにする。
サウンド型システムは、コードがその型について明確になるように強制するため、実行時に見つけるのが難しい可能性のある型関連のバグがコンパイル時に明らかになります。

より読みやすいコード。
指定されたタイプの値を実際に信頼できるため、コードが読みやすくなります。サウンドダートでは、タイプは嘘をつきません。

より保守しやすいコード。
サウンド型システムでは、1つのコードを変更すると、型システムは、壊れたばかりの他のコードについて警告することができます。

事前（AOT）コンパイルの改善。
AOTコンパイルは型なしで可能ですが、生成されたコードの効率ははるかに低くなります。

**無理やり日本語に翻訳してみたらこんな風に解説されていました。**

Listで型をチェックしているのは、理解できた。他にどんなところで使われているかというと、Mapで使われていた。

## 型推論
アナライザーは、フィールド、メソッド、ローカル変数、および最も一般的な型引数の型を推測できます。アナライザーが特定のタイプを推測するのに十分な情報を持っていない場合、アナライザーはそのdynamicタイプを使用します。

型推論がジェネリックスでどのように機能するかの例を次に示します。この例では、という名前の変数argumentsが、文字列キーとさまざまなタイプの値をペアにするマップを保持しています。

変数を明示的に入力する場合は、次のように記述できます。

```dart
Map<String, dynamic> arguments = {'argA': 'hello', 'argB': 42};
```

varまたは、またはを使用finalして、Dartにタイプを推測させることもできます。

```dart
var arguments = {'argA': 'hello', 'argB': 42}; // Map<String, Object>
```

![スクリーンショット 2022-04-02 10.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/68c74109-f2d7-4fb2-0c67-cafe337b8bc8.png)

Flutter使ってる人なら見たことがある**dynamic**とは何か?

「dynamic」は、どんな値でも代入できる型です。

このキーワードを指定した変数は、どんな型の値であっても代入することが出来ます。

こちらのサイトがわかりやすいと思います。
https://www.choge-blog.com/programming/dart%E3%80%8Cdynamic%E3%80%8D%E3%81%A8%E3%81%AF%EF%BC%9F/

## では、型推論で出てきたObjectとは何か?
Dartでは全ての変数はクラスのインスタンスとしてのオブジェクトです。
すべてのオブジェクトはObjectクラスを継承しています。
例として数値型や関数さらには、nullまでもがオブジェクトです。
と書籍書いてあった...

Dartの型をチェックする方法
こちらのサイトが参考になりました
https://www.choge-blog.com/programming/dartchecktype/

![スクリーンショット 2022-04-02 11.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/297b3f62-f9d3-c716-245e-dacaf5559e21.png)

# 最後に
まだまだ、文法への理解不足が原因でソースコードが読めないことに悩まされていますが、最近の学習で過ごしづつ理解が出来てきている気がします。