《Thanking in Java》15. 汎用型

2716 ワード

汎用型はパラメータ化タイプの概念を実現し,コードを多様なタイプに適用できるようにした.汎用用語は、多くのタイプに適用されることを意味する.汎用型がプログラミング言語に登場する場合、その最初の目的は、クラスまたはメソッドと使用されるタイプとの間の制約をデカップリングすることによって、クラス活法が最も広範な表現能力を備えることを望むことである.
15.2単純汎用
return文では、単一のオブジェクトのみを返すことができ、1回のメソッド呼び出しだけで複数のオブジェクトを返すことができる場合は、返す複数のオブジェクトのみを作成することを解決します.汎用型を使用すると、要素の読み取りは許可されますが、新しいオブジェクトの保存は許可されません.
final宣言はpublic要素を保護することができ、オブジェクトが構築された後、finalと宣言された要素に他の値を与えることはできません.
これにより、さまざまなタイプのオブジェクトツールを構築するには、汎用型を使用する必要があります.
15.3汎用インタフェース
汎用型はインタフェースにも適用できます.たとえば、オブジェクトの作成に特化したクラスであるジェネレータです.実際、これは工場方法設計モデルの応用である.ただし、ジェネレータを使用して新しいオブジェクトを作成する場合は、パラメータは必要ありませんが、ファクトリメソッドでは一般的にパラメータが必要です.
基本タイプはタイプパラメータとして使用できません.
15.4汎用方法
汎用メソッドがあるかどうかは、そのクラスが汎用であるかどうかとは関係ありません.
汎用メソッドを使用してクラス全体の汎用化に取って代わることができる場合は、汎用メソッドのみを使用する必要があります.それは、物事をより明確に理解することができるからです.また,1つのstaticメソッドでは汎用クラスのタイプパラメータにアクセスできないため,staticメソッドが汎用能力を使用する必要がある場合は汎用メソッドにしなければならない.
汎用クラスを使用する場合は、オブジェクトを作成するときにタイプパラメータの値を指定する必要がありますが、汎用メソッドを使用する場合は、コンパイラがタイプパラメータ推定と呼ばれる特定のタイプを見つけるため、パラメータタイプを指定する必要はありません.したがって、通常のメソッドを呼び出すように呼び出すことができ、無限に再ロードされたようにすることができます.
15.5匿名内部クラス
class Customer {
    private static long counter = 1;
    private final long id = counter++;

    private Customer() {
    }

    public String toString() {
        return "Customer " + id;
    }

    public static Generator generator() {
        return new Generator() {
            public Customer next() {
                return new Customer();
            }
        };
    }
}

class Teller {
    private static long counter = 1;
    private final long id = counter++;

    private Teller() {
    }

    public String toString() {
        return "Teller " + id;
    }

    public static Generator generator = new Generator() {
        public Teller next() {
            return new Teller();
        }
    };
}

15.7消去の神秘
汎用コードの内部では、汎用パラメータタイプに関する情報は取得できません.
JAva汎用は消去を使用して実現されます.これは、汎用を使用すると、特定のタイプの情報が消去されることを意味します.唯一知っているのは、オブジェクトを使用していることです.従って、ListとListは、実行時には事実上同じタイプである.どちらの形式も、それらのオリジナルタイプ、すなわちListとして消去される.
消去の主な正当な理由は,非汎化コードから汎化コードへの移行過程と,既存のクラスライブラリを破壊することなくjava言語に汎型を組み込むことである.
汎用配列を作成することはできません.一般的な解決策は、汎用配列を作成したい場所でArrayListを使用することです.
15.9境界
境界は、汎用パラメータタイプに制限条件を設定することができ、潜在的なより重要な効果は、自分の境界タイプに従ってメソッドを呼び出すことができることです.
extendsキーワードは,汎用境界コンテキスト環境において,通常の場合とは全く異なる意味を持つ.
15.10ワイルドカード
配列タイプが付与されている場合、アップシフトは適用されず、実行時に異常が放出されます.
配列は言語で完全に定義されているため、コンパイル期間と実行時のチェックを内蔵できますが、汎用型を使用する場合、コンパイラも実行時システムもタイプが何をしたいのか、どのようなルールを採用すべきか分かりません.
List>は実際には「任意のObjectタイプのオリジナルリストを持っている」を表し、List>は「ある特定のタイプの非オリジナルリストを持っているが、私たちはそのタイプが何なのか分からない」を表す.