Javaモデル

4035 ワード

クラスを定義する時、クラスの属性や方法のパラメータに対して具体的なタイプを設定しないで、一つのタグだけを使って表現します.クラスが使用する時、一つのデータタイプを動的にバインドします.これがモデルです.
范型のクラスを使用している場合は、タイプが指定されていない場合は、デフォルトのタイプObjectが使用されます.
1.モデル類
クラスで範を使うのは範型です.Class Nameを使うのが普通です.ここのTはただの習慣です.Tをしなくてはいけません.
コードで範型クラスの効果をデモンストレーションし、一つの範型クラスMessageを作成し、それぞれ二つの試験方法test 1、test 2で範型タイプInteger、Stringを指定し、いずれも正常にオブジェクトを実例化し、指定された範型タイプの属性値を設定することができるのがモデルの役割です.
package demo.pattern;

public class Test {

    @org.junit.Test
    public void test1(){
        Message message = new Message();
        message.setInfo(123);
        System.out.println(message.getInfo());
    }

    @org.junit.Test
    public void test2(){
        Message message = new Message();
        message.setInfo("you have a message");
        System.out.println(message.getInfo());
    }
}

class Message{
    private T info;

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }
}
2.ワイルドカード
次に上記の例を少し変えて、test 1メソッドでrun 1メソッドを呼び出します(パラメータMessageは任意のタイプを指定しません).実行後、元の指定したIntegerタイプの属性がStringタイプの値を新たに与えられていることが分かりました.このような制御されない状況を避けるために、モデルはワイルドカードを提供しますか?次に、run 2の方法を見て、指定されたパラメータタイプMessage>は、任意のタイプのサンプルを受信することを表しているが、この場合、パラメータ参照(つまり、message)は変更されず(setInfoメソッドを呼び出すことができません)、その情報のみを取得することができます.これがワイルドカードの役割です.
package demo.pattern;

public class Test {

    public void run1(Message message){
        message.setInfo("Integer     String");
    }

    public void run2(Message> message){
        System.out.println("     ?     :"+message.getInfo());
    }

    @org.junit.Test
    public void test1(){
        Message message = new Message();
        message.setInfo(123);
        run1(message);
        System.out.println(message.getInfo());
    }

    @org.junit.Test
    public void test2(){
        Message message = new Message();
        message.setInfo("you have a message");
        run2(message);
        System.out.println(message.getInfo());
    }
}

class Message{
    private T info;

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }
}

また、ワイルドカード2つの拡張形式は以下の通りですか?extens:范型が使えるのはこのタイプとそのサブタイプだけです.方法で値を返しますか?super:モデルが使用できるのは、このタイプとその親タイプだけで、方法のためのパラメータです.
  • ワイルドカードのまとめ
  • 無限固定ワイルドカード:読み取り専用
  • サブタイプのワイルドカード:set方法が制限されており、読み取り専用
  • スーパータイプのワイルドカード:get方法が制限されています.読み取り不可(Objectを除く).
  • だけ書き込み可能です.
    3.モデルインターフェース
    インターフェースで范型を使うというのは范型インターフェースです.范型インターフェースを使う時、そのサブタイプは范型の具体的なタイプを指定することができます.范型タイプを指定しなくてもいいです.
    package demo.pattern;
    
    public class TestInterface {
    
        @org.junit.Test
        public void test(){
            try {
                MyInterfaceImpl1.class.newInstance().myMethod("1");
                MyInterfaceImpl2.class.newInstance().myMethod("2");
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    
    interface MyInterface{
        void myMethod(T t);
    }
    
    class MyInterfaceImpl1 implements MyInterface{
        public void myMethod(T t) {
            System.out.println("1.             ");
        }
    }
    
    class MyInterfaceImpl2 implements MyInterface{
        public void myMethod(String s) {
            System.out.println("2.            ");
        }
    }
    
    4.模範的な方法
    方法の上で模範型を使って、この方法は模範型の方法です.范型の方法は必ずしも范型のクラスに定義する必要がない.
    返しタイプの前に加えて、当然返しタイプも範型(T)とすることができる.
    package demo.pattern;
    
    public class TestMethod {
    
        @org.junit.Test
        public void test(){
            run("String  ");
            run(12345);
            run(true);
        }
    
        public  void run(T t){
            System.out.println(t.toString());
        }
    }
    
    
    5.まとめ
    範型の本質思想:クラスの属性、方法のパラメータは、すべてユーザーが使用時に動的に設定することができます.