0

現在、次の例のように、特定の Collection 実装を含むクラスがあります。

public class Bag {

    Set<?> items;

    public <T> Set<T> getItems() {
        return (Set<T>) items;
    }
}

コンテナーを一般化する必要がありますが、同様の getItems() メソッドを取得する方法を理解するのに苦労しています。

public abstract class AbstractBag<S extends Collection<?>> {

    S items;

    public <T> S<T> getItems(){  // <- does not compile
        return (S<T>) items;
    }
}

最終的な目的は、次のように、同じオリジナル バッグ、または他のコンテナーを含むバッグを取得することです。

public class SetBag extends AbstractBag<Set<?>> {}
public class ListBag extends AbstractBag<List<?>> {}

出来ますか?ありがとう。

編集: このコードが必要な理由 (と思う) について詳しく説明します。あらゆるタイプの属性をサポートする必要があるクラスがあります。これらの属性は、その特定のタイプの値のコレクションです (たとえば、文字列のセット、整数のセット、WhateverClass のセット)。特定のキーに関連付けられたこのデータを格納するマップがあります。その後、キーを呼び出して戻りオブジェクトを正しくキャストすることで、データを取得できます。便宜上、これは上記の一般的な方法で行われます。

ここで、コレクション タイプが異なる 2 番目のクラスが必要です。コードの繰り返し (ここにあるコードよりもはるかに多くのコード) を避けるために、コレクションをジェネリック型 (AbstractBag など) として持つ抽象クラスを作成し、異なるコンテナーを持つ 2 つのクラス (たとえば、リストとSetBag と ListBag の場合と同じように)。

4

1 に答える 1