2010-11-17 13 views
16
public static BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode left = BTNode.treeCopy(source.left); 
     BTNode right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 

} 

Moje pytanie brzmi: dlaczego nie mogę użyć ogólnego typu E w kontekście statycznym? Próbowałem wyszukiwania dla kilku odpowiedzi nie mogłem znaleźć żadnych, które sprawią, że się zakradnę.Używanie typów ogólnych w kontekście statycznym

+0

możliwy duplikat [metody statycznej w klasie ogólnej?] (Http://stackoverflow.com/questions/936377/static-method-in-a-eneric-class) –

Odpowiedz

19

Musisz zadeklarować typ rodzajowy w podpisie metoda:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode<E> left = BTNode.treeCopy(source.left); 
     BTNode<E> right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 
} 
7

E może oznaczać cokolwiek. Aby użyć E (jako generyczny), musisz utworzyć instancję obiektu. Nie można tego zrobić, jeśli masz metodę statyczną, ponieważ ogólne parametry typu są tylko w zakresie dla instancji klasy (która obejmuje metody instancji i pola instancji).

Statyczne elementy i pola należą do każdej instancji klasy. Więc jeśli masz instancję BTNode<String> i inną instancję z BTNode<Integer>, co dokładnie powinien używać statyczny treeCopy? String lub Integer?

Istnieje urządzenie do pracy; musisz powiedzieć statycznej metodzie, co oznacza: E. Więc trzeba będzie określić ją tak:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 

Byłoby to również pomóc podjąć drugą spojrzeć na projekt i sprawdzić, czy to jest rzeczywiście to, co chcesz.

Powiązane problemy