2016-06-24 15 views
0

Im Moment habe ich eine Klasse, die eine bestimmte Sammlung Implementierung enthalten, ähnlich wie das folgende Beispiel:Allgemeine Methoden in Verbindung mit generischen Container

public class Bag { 

    Set<?> items; 

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

Ich muss jetzt den Behälter verallgemeinern, aber ich habe Schwierigkeiten zu verstehen, wie zu erhalten, die eine ähnliche getItems() Methode:

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

    S items; 

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

Das endgültige Ziel ist, die selbe Tasche oder Beutel mit anderen Behältern zu erhalten, wie folgt:

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

Ist es möglich? Danke.

EDIT: Ich werde mehr Details zur Verfügung stellen, warum (ich denke) dieser Code notwendig ist. Ich habe eine Klasse, die Attribute jeglicher Art unterstützen muss. Diese Attribute sind eine Sammlung von Werten dieses speziellen Typs (z. B. eine Menge von Strings, eine Menge von ganzen Zahlen oder eine Menge von WhateverClass). Ich habe eine Karte, die diese mit einem bestimmten Schlüssel verbundenen Daten speichert. Sie können die Daten dann abrufen, indem Sie den Schlüssel aufrufen und das Rückgabeobjekt korrekt umsetzen. Der Einfachheit halber wird dies durch die oben genannte generische Methode erreicht.

Jetzt muss ich eine zweite Klasse haben, wo der Sammlungs-Typ anders ist. Um Codewiederholung zu vermeiden (viel mehr Code als hier), möchte ich eine abstrakte Klasse erstellen, die die Sammlung als generischen Typ hat (wie AbstractBag), und die zwei Klassen mit unterschiedlichen Containern erhalten (zum Beispiel einen mit Listen und Eins mit Sets) wie für SetBag und ListBag.

+0

Warum möchten Sie typisierte Methoden? Normalerweise wird der Elementtyp im Container parametrisiert. – Bohemian

+0

Dies ist eine zu starke Vereinfachung des eigentlichen Codes. Ich werde die Frage erweitern, um den Grund klarer zu machen, warum ich das brauche. –

Antwort

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

Leider muss der Typ wie in der ursprünglichen Bag-Klasse zugewiesen werden, wenn er über die getItems() -Methode abgerufen wird. –

+0

Tun Sie es nicht, auch wenn es möglich ist. Es macht keinen Sinn und würde wahrscheinlich viele Bugs verursachen. – aviad

+0

Dies ist eine zu starke Vereinfachung des eigentlichen Codes. Ich werde die Frage erweitern, um den Grund klarer zu machen, warum ich das brauche. –

Verwandte Themen