🙆

[Java] ジェネリクス(2) 型パラメータ制限

2024/11/07に公開

型パラメータ制限!

ジェネリクス文法はデータ型が決まっていないため、メソッドの実装が制限されます。
→ ジェネリクスクラスでは望む機能を作成することができません。

このような問題を解決するために、タイプ引数を制限する文法を使用します。

<hr/>

タイプ引数を制限する文法を適用したクラスの例を見てみましょう。

電話機能を持つクラスの作成

クラス名: Phone

public class Phone {
   public void call(){
       System.out.println("전화");
   }
}

class MobliePhone extends Phone{
   public void sendMsg(){
       System.out.println("메시지 전송");
   }
}


class SmartPhone extends MobliePhone{
   public void playApp(){
       System.out.println("앱 실행");
   }
}

ジェネリクスクラスの生成

クラス名: PhoneBox < T >

public class PhoneBox<T> {
   private T data;


   public void phoneTest(T data){
       this.data = data;
   }


}

参考) Tにはどのような型が入るか分からないため、機能を使うのが制限的です。

データ型Tを<span style=color:red>PhoneクラスまたはPhoneクラスを継承したクラスのみ(サブクラス)を許可するように型引数を制限</span>

PhoneBox < T extends Phone>

public class PhoneBox<T extends Phone> {
   private T data;


   public void phoneTest(T data){
       this.data = data;
   }


}

これで PhoneBox で Phone クラスのメソッドまたはフィールドが使用可能になりました

<注意点>
Phone, MobilePhone, SmartPhone => call メソッド機能が使用可能
MobilePhone => call, sendMsg メソッドが使用可能
SmartPhone => call, sendMsg, playApp メソッドが使用可能
😡 <span style=color:red> つまり、extends Phone は Phone クラスのフィールドまたはメソッドのみ使用可能です

public class PhoneBox<T extends Phone> {
   private T data;




   // extends PhoneはPhoneの機能のみ使用可能
   public void phoneTest(T data){
       this.data = data;
       data.call();


   }




}

Testクラスの生成

PhoneBoxオブジェクトを生成する際にはPhoneクラスまたはPhoneクラスを継承したタイプのみ指定可能です!

public class PhoneTest {
   public static void main(String[] args) {
       //PhoneBoxオブジェクト生成時の注意点!
        //PhoneBoxのタイプ引数にはPhone、MobilePhone、SmartPhoneのみが指定可能です。
        //PhoneBox<String> phone = new PhoneBox<>(); -> タイプ引数が異なるためエラーが発生します!

        //PhoneBoxオブジェクト生成
       PhoneBox<Phone> phone1 = new PhoneBox<>();
       PhoneBox<MobliePhone> phone2 = new PhoneBox<>();
       PhoneBox<SmartPhone> phone3 = new PhoneBox<>();

![](https://storage.googleapis.com/zenn-user-upload/ca5c5fc6ae50-20241108.png)

       phone1.phoneTest(new Phone());
   }
}

Discussion