3

最近、次のパターンのインスタンスに遭遇しました。

public interface IFooFactory {
    <K> Foo<K> create();
}

具体例はこちらをご覧ください。オブジェクトの正式な型パラメーターを使用して、または正式な型パラメーターをまったく使用せずにFooをインスタンス化する以外に、クライアント プログラマーがcreateの実装で何をすべきかわかりません。また、フレームワークの設計者がインターフェイスIFooFactoryをこのように定義することで表現しようとした利点や型の制約についてもわかりません。

4

3 に答える 3

5

利点は、実装者ではなく、メソッドのユーザーにあります。Collections.emptyList()このパターンの有益な使用法の良い例です。これにより、次のように空のリストを宣言できます。

List<String> myEmptyList = Collections.emptyList();

メソッドがraw、、、またはを返したList場合List<Object>List<?>この方法でメソッドを使用するにはキャストが必要になります。

于 2012-09-06T09:42:13.337 に答える
5

考えてみてくださいCollections.emptyList()。返されるリストオブジェクトは常に同じです。リストは空で不変であるため、typeパラメータの代わりに使用される具象型に応じて異なる動作を示すために、返されるオブジェクトに対して呼び出し元ができることは何もありません。したがって、(rawタイプを使用した)単一の実装で十分です。

public static <T> List<T> emptyList() {
    return THEEMPTYLIST;
}

public static final List THEEMPTYLIST = new List() {
    public int size() { return 0; }
    ...
};

ただし、このemptyListメソッドは型推論を可能にするため、呼び出し元にとってこれをより便利にします。

List<String> noStrings = Collections.EMPTY;  // Gives compiler warning due to use of raw types
List<String> noStrings2 = Collections.emptyList(); // No compiler warning, type parameter inferred.
于 2012-09-06T09:42:18.560 に答える
1

オブジェクトの正式な型パラメーターを使用して、または正式な型パラメーターをまったく使用せずに Foo をインスタンス化する以外に、クライアント プログラマーが create の実装で何をすべきかわかりません。

うーん...とても簡単です...

<K> Foo<K> create() {
    return new Foo<K>();
}
于 2012-09-06T19:08:36.000 に答える