2016-06-24 12 views
0

私は現在、非常に、次の例のように、特定のコレクションの実装が含まれているクラスを持っています類似の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のセット)。私は、このデータを特定のキーに関連付けて格納するマップを持っています。これで、キーを呼び出して戻りオブジェクトを正しくキャストすることでデータを取得することができます。便宜上、これは上記の一般的な方法で行います。

は今、私はコレクション型が異なる第二のクラスを持っている必要があります。コードの繰り返し(ここにあるものよりもはるかに多くのコード)を避けるために、私は(AbstractBagのような)ジェネリック型としてコレクションを持って抽象クラスを作成したい、とリストでインスタンス1のために(別のコンテナを持つ2つのクラスを取得し、 SetがSetBagとListBagの場合と同様)。

+0

は、なぜあなたは型付きのメソッドをしたいですか?通常、コンテナ内の要素タイプはパラメータ化されます。 – Bohemian

+0

これは実際のコードを単純化したものです。なぜ私はこれが必要なのかをより明確にするために質問を広げます。 –

答えて

1
public static void main(String[] args) throws Exception 
{ 
    SetBag<Integer> setBag = new SetBag<>(); 
} 

public static abstract class AbstractBag<S extends Collection<?>> 
{ 
    S items; 

    public S getItems() 
    { 
     return items; 
    } 
} 

public static class SetBag<T> extends AbstractBag<Set<T>> 
{ 
} 
+0

残念ながら、元のBagクラスの場合と同様に、getItems()メソッドで取得するときに型を割り当てる必要があります。 –

+0

可能であってもそれはしません。それはどんな意味がないと、おそらく多くのバグを引き起こす – aviad

+0

これは、実際のコードの単純化です。なぜ私はこれが必要なのかをより明確にするために質問を広げます。 –

関連する問題