現在、次の例のように、特定の 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 の場合と同じように)。