クラスのパラメータ化
クラスのパラメータ化について復習。
- クラス名の後に「<型パラメータ名 ..>」をつけることで、パラメータとして受け付ける型を指定できる。
- 例) 「class Hoge
{}」
- 例) 「class Hoge
- 「extends」を使用すると、受け付ける型を限定することができる。
// 任意の型を受け付けるクラス class A<T> { void set( T obj ) {} T get( ) { return null; } } //InputStream派生の型のみ受け付けるクラス class B<T extends InputStream> { void set( T obj ) {} T get( ) { return null; } } InputStream in = null; // クラスAには任意の型をパラメータとして指定できる。 A<Object> a1 = new A<Object>(); A<String> a2 = new A<String>(); A<InputStream> a3 = new A<InputStream>(); a1.set(new Object()); a1.set(""); a1.set(in); a1.set(new ByteArrayInputStream( new byte[0] )); //a2.set(new Object()); // コンパイルエラー a2.set(""); //a2.set(in); // コンパイルエラー //a2.set(new ByteArrayInputStream( new byte[0] )); // コンパイルエラー //a3.set(new Object()); // コンパイルエラー //a3.set(""); // コンパイルエラー a3.set(in); a3.set(new ByteArrayInputStream( new byte[0] )); // クラスBはInputStream派生の型のみパラメータとして指定できる。 //B<Object> b1 = new B<Object>(); // コンパイルエラー //B<String> b2 =new B<String>(); B<InputStream> b3 =new B<InputStream>(); B<ByteArrayInputStream> b4 =new B<ByteArrayInputStream>(); //b3.set(new Object()); // コンパイルエラー //b3.set(""); // コンパイルエラー b3.set(in); b3.set(new ByteArrayInputStream( new byte[0] )); //b4.set(new Object()); // コンパイルエラー //b4.set(""); // コンパイルエラー //b4.set(in); // コンパイルエラー b4.set(new ByteArrayInputStream( new byte[0] )); //InputStream派生の型のみ受け付けるクラス class C<T extends InputStream> { void set( T obj ) { try { obj.read(); // InputStream のAPIが実行できる。 } catch (IOException e) {} } T get( ) { return null; } }