<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>generic</title>
	<atom:link href="https://techgrowup.net/tag/generic/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sat, 05 Oct 2024 03:01:29 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>generic</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門39 Dartのジェネリクスを使いこなそう</title>
		<link>https://techgrowup.net/flutter-dart-generics-collection/</link>
					<comments>https://techgrowup.net/flutter-dart-generics-collection/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 05 Oct 2024 03:01:27 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Collection]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[generic]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1923</guid>

					<description><![CDATA[はじめに Dartは、柔軟で再利用可能なコードを設計するために**ジェネリクス（Generics）**という強力な機能を提供しています。ジェネリクスを使うことで、データの型を動的に処理し、同時に型安全性を保つことが可能で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph"><strong>Dart</strong>は、柔軟で再利用可能なコードを設計するために**ジェネリクス（Generics）**という強力な機能を提供しています。ジェネリクスを使うことで、データの型を動的に処理し、同時に型安全性を保つことが可能です。特に、コレクション（リストやマップなど）を操作する際に、ジェネリクスを活用することで、型エラーを防ぎ、効率的なコードを書くことができます。</p>



<p class="wp-block-paragraph">この記事では、<a rel="noopener" target="_blank" href="https://dart.dev/language/generics#generic-collections-and-the-types-they-contain">Dart公式ドキュメント<span class="fa fa-external-link external-icon anchor-icon"></span></a>を基に、ジェネリクスの基本概念から、ジェネリックコレクションの操作、さらにはFlutter開発におけるジェネリクスの応用例について解説します。ジェネリクスを使いこなすことで、より安全で拡張性の高いアプリケーション開発が可能になるでしょう。</p>



<h2 class="wp-block-heading">ジェネリクスとは</h2>



<p class="wp-block-paragraph"><strong>ジェネリクス</strong>（Generics）は、クラスや関数において、扱うデータ型を動的に指定できる仕組みです。これにより、型に依存しない柔軟なコードが書ける一方で、指定した型に対してのみ処理を行うため、<strong>型安全</strong>なコードを保つことができます。</p>



<h3 class="wp-block-heading">ジェネリクスのメリット</h3>



<ul class="wp-block-list">
<li><strong>型安全性の向上</strong>：特定の型以外が使われた場合にコンパイル時にエラーを発生させるため、バグが減ります。</li>



<li><strong>再利用性の向上</strong>：ジェネリクスを使うことで、異なる型に対応するクラスや関数を1つの汎用コードで実現できます。</li>



<li><strong>可読性の向上</strong>：データ型が明示的になるため、コードの意図がわかりやすくなります。</li>
</ul>



<h2 class="wp-block-heading">ジェネリックコレクションとは</h2>



<p class="wp-block-paragraph">Dartでは、コレクション（リスト、セット、マップなど）にもジェネリクスが適用されます。これにより、コレクション内のデータ型を明示的に指定することができ、誤った型のデータが追加されることを防ぎます。</p>



<p class="wp-block-paragraph">コレクションがわからない方は以下の記事を見てみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/flutter-dart-collection/" title="Flutter開発入門38 Dartのコレクションを解説：List, Set, Mapの使い方と効率的なデータ操作" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-160x90.webp 160w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-1024x585.webp 1024w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-768x439.webp 768w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-120x68.webp 120w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-320x180.webp 320w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection-376x212.webp 376w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-collection.webp 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Flutter開発入門38 Dartのコレクションを解説：List, Set, Mapの使い方と効率的なデータ操作</div><div class="blogcard-snippet internal-blogcard-snippet">DartのコレクションであるList、Set、Mapの使い方を徹底解説。基本的な操作から便利なメソッド、データ管理の効率化までを詳しく説明し、Flutterアプリ開発に役立つ知識を提供します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.03</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading">例1：ジェネリックリスト</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void main() {
  // int型のデータを扱うリスト
  List&lt;int&gt; numbers = [1, 2, 3, 4, 5];

  // String型のデータを扱うリスト
  List&lt;String&gt; fruits = ['Apple', 'Banana', 'Orange'];

  // 型違いの要素を追加しようとするとエラー
  // numbers.add('six'); // エラー: String型はint型のリストに追加できない
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// int型のデータを扱うリスト</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt; numbers = [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// String型のデータを扱うリスト</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">&gt; fruits = [</span><span style="color: #CE9178">&#39;Apple&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Banana&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Orange&#39;</span><span style="color: #D4D4D4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 型違いの要素を追加しようとするとエラー</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// numbers.add(&#39;six&#39;); // エラー: String型はint型のリストに追加できない</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">例2：ジェネリックマップ</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void main() {
  // String型のキーとint型の値を持つマップ
  Map&lt;String, int&gt; scores = {
    'Alice': 95,
    'Bob': 85,
    'Charlie': 90,
  };

  // 型違いのキーや値を使用しようとするとエラー
  // scores['David'] = 'ninety'; // エラー: String型はint型として使用できない
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// String型のキーとint型の値を持つマップ</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Map</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt; scores = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;Alice&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">95</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;Bob&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">85</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;Charlie&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">90</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 型違いのキーや値を使用しようとするとエラー</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// scores[&#39;David&#39;] = &#39;ninety&#39;; // エラー: String型はint型として使用できない</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">ジェネリックコレクションを使用することで、誤った型のデータがリストやマップに格納されることを防ぎ、コードの安全性が向上します。</p>



<h2 class="wp-block-heading">ジェネリッククラスとメソッド</h2>



<p class="wp-block-paragraph">Dartでは、ジェネリクスを使って、型に依存しない汎用クラスやメソッドを作成できます。これにより、同じ処理を異なるデータ型に対して行うことが可能になります。</p>



<h3 class="wp-block-heading">ジェネリッククラスの作成例</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// Tというジェネリック型を使うクラス
class Box&lt;T&gt; {
  T value;

  Box(this.value);

  void show() {
    print('Value: $value');
  }
}

void main() {
  // int型のデータを扱うBox
  var intBox = Box&lt;int&gt;(123);
  intBox.show(); // Value: 123

  // String型のデータを扱うBox
  var stringBox = Box&lt;String&gt;('Hello');
  stringBox.show(); // Value: Hello
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Tというジェネリック型を使うクラス</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4"> value;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Box</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.value);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">show</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Value: $</span><span style="color: #9CDCFE">value</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// int型のデータを扱うBox</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> intBox = </span><span style="color: #4EC9B0">Box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #B5CEA8">123</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  intBox.</span><span style="color: #DCDCAA">show</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// Value: 123</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// String型のデータを扱うBox</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> stringBox = </span><span style="color: #4EC9B0">Box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #CE9178">&#39;Hello&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  stringBox.</span><span style="color: #DCDCAA">show</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// Value: Hello</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">ジェネリックメソッドの作成例</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// Tというジェネリック型を使う汎用メソッド
T getFirstElement&lt;T&gt;(List&lt;T&gt; items) {
  return items[0];
}

void main() {
  var numbers = [1, 2, 3];
  var names = ['Alice', 'Bob', 'Charlie'];

  print(getFirstElement(numbers));  // 1
  print(getFirstElement(names));    // Alice
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Tというジェネリック型を使う汎用メソッド</span></span>
<span class="line"><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getFirstElement</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt; items) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> items[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> numbers = [</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">];</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> names = [</span><span style="color: #CE9178">&#39;Alice&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Bob&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Charlie&#39;</span><span style="color: #D4D4D4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">getFirstElement</span><span style="color: #D4D4D4">(numbers));  </span><span style="color: #6A9955">// 1</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">getFirstElement</span><span style="color: #D4D4D4">(names));    </span><span style="color: #6A9955">// Alice</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">ジェネリッククラスやメソッドは、異なる型のデータに対しても柔軟に対応できるため、<strong>再利用性</strong>や<strong>拡張性</strong>を高めることができます。</p>



<h2 class="wp-block-heading">ジェネリクスの型制約</h2>



<p class="wp-block-paragraph">Dartでは、ジェネリクスに<strong>型制約</strong>を設けることで、特定の型やそのサブクラスにのみジェネリクスを適用することができます。これにより、特定のインターフェースやクラスの機能を利用できることを保証します。</p>



<h3 class="wp-block-heading">型制約の例</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// num型もしくはそのサブクラス（int, double）を制約とするクラス
class NumericBox&lt;T extends num&gt; {
  T value;

  NumericBox(this.value);

  void showValue() {
    print('Numeric Value: $value');
  }
}

void main() {
  var intBox = NumericBox&lt;int&gt;(123);
  intBox.showValue(); // Numeric Value: 123

  var doubleBox = NumericBox&lt;double&gt;(3.14);
  doubleBox.showValue(); // Numeric Value: 3.14

  // String型を指定しようとするとエラー
  // var stringBox = NumericBox&lt;String&gt;('Hello'); // エラー
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// num型もしくはそのサブクラス（int, double）を制約とするクラス</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">NumericBox</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">num</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4"> value;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">NumericBox</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.value);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">showValue</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Numeric Value: $</span><span style="color: #9CDCFE">value</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> intBox = </span><span style="color: #4EC9B0">NumericBox</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #B5CEA8">123</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  intBox.</span><span style="color: #DCDCAA">showValue</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// Numeric Value: 123</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> doubleBox = </span><span style="color: #4EC9B0">NumericBox</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">double</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #B5CEA8">3.14</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  doubleBox.</span><span style="color: #DCDCAA">showValue</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// Numeric Value: 3.14</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// String型を指定しようとするとエラー</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// var stringBox = NumericBox&lt;String&gt;(&#39;Hello&#39;); // エラー</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">この例では、<code>T extends num</code>という型制約を設けることで、<code>NumericBox</code>クラスが数値型（<code>int</code>や<code>double</code>）のみを扱えるように制限しています。</p>



<h2 class="wp-block-heading">ジェネリクスを使うべきシーン</h2>



<p class="wp-block-paragraph">ジェネリクスは、特定のシーンで非常に役立ちます。以下のような場合には、ジェネリクスを積極的に利用することをおすすめします。</p>



<ol class="wp-block-list">
<li><strong>コレクションを操作する場合</strong>
<ul class="wp-block-list">
<li>リストやマップなどのコレクションを扱う際には、ジェネリクスを使って型安全性を確保することができます。特に、さまざまな型のデータが混在する可能性がある場合、ジェネリクスを使うことで、誤った型のデータを追加してしまうエラーを防ぐことができます。</li>
</ul>
</li>



<li><strong>汎用クラスやメソッドを作成する場合</strong>
<ul class="wp-block-list">
<li>ジェネリクスを使うことで、1つのクラスやメソッドを複数のデータ型に対応させることができます。これにより、重複するコードを書く必要がなくなり、保守性が向上します。</li>
</ul>
</li>



<li><strong>型安全性を強化したい場合</strong>
<ul class="wp-block-list">
<li>ジェネリクスを使うことで、コードにおける型安全性が大幅に向上します。コンパイル時に型チェックが行われるため、実行時のエラーを未然に防ぐことができ、バグの発生を減らすことができます。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Dartの<strong>ジェネリクス</strong>は、型安全なコレクションの操作や汎用的なクラス・メソッドの作成に不可欠な機能です。ジェネリクスを使うことで、異なるデータ型に柔軟に対応しつつ、型安全性を保つことができます。また、コードの再利用性や保守性も向上し、効率的な開発が可能となります。</p>



<p class="wp-block-paragraph">今回紹介したように、Dartのジェネリクスはリストやマップなどのコレクション操作に限らず、さまざまな場面で活躍します。ジェネリクスを使いこなして、DartやFlutterでのアプリ開発をさらに効率化していきましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-dart-generics-collection/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
