2009-09-13 10 views
11
public abstract class AbstractTool<AT extends AbstractThing> { 
    protected ArrayList<AT> ledger; 
    public AbstractTool() { 
     ledger = new ArrayList<AT>(); 
    } 

    public AT getToolAt(int i) { 
     return ledger.get(i); 
    } 

    // More code Which operates on Ledger ... 

} 

public class Tool<AT extends AbstractThing> extends AbstractTool { 
    public Tool() { 
     super(); 
    } 
} 

Jak poprawnie nazywać Super zdać AT generycznym Tool do konstruktora AbstractTool?Rozszerzenie Generic Abstract Class & Prawidłowe użycie Super

Wydaje się bez względu na to, co wybiorę AT być kiedy Oświadczam Tool (powiedzmy, Tool<Thing>), że ja zawsze wrócić się AbstractThing zamiast Thing. Wydaje się, że to nie jest celem generycznych ...

Pomoc?

Odpowiedz

19
public class Tool<AT extends AbstractThing> extends AbstractTool<AT> { 

Innymi słowy, jeśli rozszerzyć lub wdrożyć coś z rodzajowych, należy pamiętać, aby określić argumenty dla nich leków generycznych.

+1

W tym przypadku, ponieważ ograniczenia typu na typowym parametrze AbstractTool będą dziedziczone, można po prostu napisać 'public class Tool extends AbstractTool '. Byłby to funkcjonalny odpowiednik, ponieważ definicja AbstractTool zatrzymałaby Cię przy użyciu ogólnego parametru, który nie byłby "AbstractThing". –

3

Czy nie powinien to być raczej Tool<AT extends...> extends AbstractTool<AT>?

0

myślę, co prawdopodobnie chcesz to:

public abstract class AbstractTool<AT extends AbstractThing> { 
     protected List<AT> ledger = new ArrayList<AT>(); 

     public AT getToolAt(int i) { 
      return ledger.get(i); 
     } 

     // More code Which operates on Ledger ... 

    } 

    public class Tool extends AbstractTool<Thing> { 
     // Tool stuff ... 
    } 

Od Tool jest beton klasy, to nie musi być parametryzowane się. Nie ma potrzeby konstruktorów, jeśli zainicjujesz List (oh i pamiętaj, aby programować do interfejsu) w deklaracji, a ponieważ jest ona chroniona, podklasy mogą uzyskać do niej bezpośredni dostęp.

+0

Thare są rzeczywiście niektóre momenty, w których bardzo przydatna jest parametryzacja konkretnych klas. ArrayList, LinkedList, HashMap, HashSet, wszystkie są parametryzowane, a wszystkie z nich są również klasami konkretnymi. –

+1

Nie powiedziałem, że nie było. Ale to bardzo upraszcza kod klienta, jeśli nie musisz. Klasy typów kontenerów oczywiście wymagają sparametryzowania ich konkretnych typów i być może czytałem zbyt wiele w minimalnym przykładzie, ale nie sądziłem, że PO tego wymaga. – Robert

+0

OK, rozumiem twój punkt :) –

Powiązane problemy