talosのプログラミング教室

Java Gold合格への道 ~型境界~

スポンサーリンク

こんにちは。たろすです。

今回は型境界について説明します。

型境界とは

型パラメータを宣言する際に、型変数がとり得ることができる型に課すことができる制約を「型境界」と呼びます。

以下のように記述すると型変数TはNumber型のサブタイプしかとれなくなり、それ以外を指定するとコンパイルエラーになります。

public class X<T extends Number> {}
// コンパイルOK
X<Number> x1 = new X<Number>();
X<Integer> x2 = new X<Integer>();

// コンパイルNG
X<Object> x3 = newX <Object>();
X<String> x4 = new X<String>();

ワイルドカードの上限境界、下限境界

型引数にはワイルドカードを使用することができます。

X<?> x;

ワイルドカードは任意の型で、変数宣言の時点では型引数に指定される型が未定であることを表しています。

ワイルドカードを使用した型パラメータには上限境界と下限境界を指定することができます。

それぞれ以下のように記述します。

public class Z<T> {}

public class Y {
	// 上限限界
	void method1(Z<? extends Number> z) {}
	
	// 下限限界
	void method2(Z<? super Integer> z) {}
}

method1()では型引数がNumber型のサブタイプに制限され、method2()では型引数がInteger型のスーパータイプに制限されます。

したがって、コンパイルが通るコード、通らないコードは以下のようになります。

// コンパイルOK
y.method1(new Z<Integer>());
y.method2(new Z<Number>());

// コンパイルNG
y.method1(new Z<Object>());
y.method2(new Z<Double>());

おわりに

今回は型境界について説明しました。