2016-06-24 7 views
0

J'ai actuellement une classe qui contient une application de collecte spécifique, tout comme l'exemple suivant:méthodes génériques en conjonction avec des conteneurs génériques

public class Bag { 

    Set<?> items; 

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

J'ai besoin maintenant de généraliser le conteneur, mais j'avoir des ennuis à comprendre comment obtenir un getItems similaires() méthode:

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

    S items; 

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

le but final est d'obtenir le même sac original, ou sac avec d'autres conteneurs, comme suit:

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

Est-ce possible? Merci.

EDIT: Je vais fournir plus de détails sur pourquoi (je pense) que ce code est nécessaire. J'ai une classe qui doit supporter des attributs de tout type. Ces attributs sont une collection de valeurs de ce type particulier (par exemple un ensemble de chaînes, un ensemble d'entiers ou un ensemble de WhateverClass). J'ai une carte qui stocke ces données associées à une clé donnée. Il est alors possible de récupérer les données en appelant la clé et en castant l'objet de retour correctement. Pour plus de commodité, ceci est fait par la méthode générique ci-dessus.

Maintenant, j'ai besoin d'une deuxième classe où le type de collection est différent. Pour éviter la répétition de code (beaucoup plus de code que ce qui est ici), je voudrais créer une classe abstraite qui a la collection comme un type générique (comme AbstractBag), et obtenir les deux classes avec des conteneurs différents (par exemple un avec Listes et un avec des ensembles) comme fait pour SetBag et ListBag.

+0

Pourquoi voulez-vous des méthodes typées? Habituellement, le type d'élément dans le conteneur serait paramétré. – Bohemian

+0

Ceci est une simplification excessive du code réel. Je vais élargir la question pour clarifier la raison pour laquelle j'ai besoin de cela. –

Répondre

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

Malheureusement, comme dans la classe Bag d'origine, le type doit être affecté lorsqu'il est récupéré via la méthode getItems(). –

+0

Ne le faites pas même si c'est possible. Cela n'a aucun sens et probablement causerait beaucoup de bugs – aviad

+0

Ceci est une simplification excessive du code réel. Je vais élargir la question pour clarifier la raison pour laquelle j'ai besoin de cela. –