プログラミング

【Java初心者向け】ジェネリクス(総称型)やワイルドカードの使い方

プログラミング
この記事は約4分で読めます。
Sponsored Links

ジェネリックスとは?

三輪車, 赤, 小児期, おもちゃ, 楽しい, 乗る, レトロ, 交通, 懐かしい, 小, 3, レジャー
public class Sample { List<String> list = new ArrayList<>();
  public static <T> T getT(T t){
   return t;
  }
}

ジェネリクスは別名「総称型」とも呼ばれており、コレクションやメソッドなどに対して導入されるものです。上記のコードの<>部分をジェネリクスと呼んでいます。java1.5にてその機能が導入されました。ジェネリクスには「 一時的にデータ型を置いておく」という機能があります。

ジェネリクスの種類

ビジネス カード, Pixabay, 会社, アドレス, 名前, ロゴ, 会社のロゴ, カード, 地図
EElement要素
KKeyキー
VValue
TTypeタイプ
NNumber数値
S2番目
U3番目
V4番目

基本的にジェネリクスはアルファベット1文字で表します。ジェネリクスを指定することでコードでどんな型を使っているかをわかりやすくしつつ、幅を持たせることができます。また、ただ明示するだけでなく、間違った型を使用するとコンパイルエラーが出るため、コードの記述ミスが減るというメリットもあります。

ジェネリクスの使い方

心, 愛, ロマンス, 愛情, 母の日, バレンタインデー, ベアー, テディー ・ ベア, かわいいクマ

ジェネリクスはクラスやメソッド、コレクションなど様々な場面で使うことができます。次にジェネリクスの使い方を学習していきましょう。

① 一時的にデータ型を指定しておく

ジェネリクスを利用するには、まずジェネリクスを利用したメソッドやクラスを定義する必要があります。ここではそれらの定義方法に関して学習しましょう。

クラスでジェネリクスを使う方法

public class Sample<T> {
  private T sample;
}

public void sample_2() {
  Sample<String> sample = new Sample<>();
}

フィールドの型をジェネリクスにすることで、クラス名自体に総称型で書くことができます。こうすることで、インスタンス生成時に型を指定することができます。

メソッドでジェネリクスを使う

public static <T> T getT(T t){
 return t;
}

次にメソッドにジェネリクスをおく方法です。データ型の前にジェネリクスを置くことで戻り値の型を後から決めることができます。

② 仮置きのデータ型を具体化する

public class Sample { List<String> list = new ArrayList<>();
}

次に、ジェネリクスで仮置きしたクラスやメソッドなどを具体化してメソッドを使ってみましょう。今回は特に利用することの多いコレクションを踏まえて説明します。コレクションを利用する際に上記のような記述をすると思いますが、これもジェネリクスを利用しているのです。ListインタフェースはList<T>と定義されています。よって、インスタンス生成時にジェネリクスを指定することができます。

ワイルドカード

オールドタイマー, ラジオ, レトロ, クイーンエリザベス, マム, フィギュア, クイーンズ観図, 波

次に学習するのは「ワイルドカード」です。ジェネリクスの部分に「?」を定義することで「通常のジェネリクスより幅広く未確定なデータ型を定義できる」という機能があります。ただ、ワイルドカードを定義してしまう、データの幅が広くなり過ぎてしまうので、superやextendsを使用することで「ワイルドカードのもつことのできるデータ型に制限をつける」ということもできます。以下のクラス構造を参考にsuperとextendsについて学習していきましょう。

ワイルドカードの幅指定<extends>

public class Sample<T extends mammalian> {

 //処理内容

}

ワイルドカードを指定する際に、<? extends T>を指定すると型指定できるクラスに上限をつけることができます。こうすることで、ワイルドカードに制限をつけることができます。

ワイルドカードの幅指定<super>

public class Sample<T super mammalian> {

 //処理内容

}

ワイルドカードに下限をつける場合は<? super T>を利用します。こうすることで、TもしくはTのスーパークラスしか型指定できなくなります。

最後に

ジェネリクスの理解はできたでしょうか?特にワイルドカードを指定する場合、最初は理解に苦しむかもしれませんが、頑張って覚えましょう。

タイトルとURLをコピーしました