Poniżej znajduje się fragment pokazujący, jak utworzyć klasę ogólną java, aby dołączyć pojedynczy element do tablicy. Jak mogę uczynić appendToArray metodą statyczną. Dodanie wartości statycznej do podpisu metody powoduje błędy kompilacji.
public class ArrayUtils<E> {
public E[] appendToArray(E[] array, E item) {
E[] result = (E[])new Object[array.length+1];
result[array.length] = item;
return result;
}
}
Odpowiedzi:
jedyne, co możesz zrobić, to zmienić swój podpis na
Ważne szczegóły:
Wyrażenia ogólne poprzedzające wartość zwracaną zawsze wprowadzają (deklarują) nową zmienną typu ogólnego.
Ponadto zmienne typu między typami (
ArrayUtils
) i metodami statycznymi (appendToArray
) nigdy nie kolidują ze sobą.Więc co to oznacza: w mojej odpowiedzi
<E>
ukryłbymE
przed,ArrayUtils<E>
gdyby metoda nie byłastatic
. I<E>
nie ma nic wspólnego zE
fromArrayUtils<E>
.Aby lepiej odzwierciedlić ten fakt, bardziej poprawną odpowiedzią byłoby:
źródło
E
a zmienną typu metody statycznejE
. Uważam, że znacznie lepszą praktyką jest użycie innej nazwy zmiennej podczas deklarowania metod ogólnych, statycznych lub innych, wewnątrz klas ogólnych.Zwróć uwagę na
<E>
.Statyczne metody generyczne wymagają własnej deklaracji ogólnej (
public static <E>
) oddzielnej od deklaracji ogólnej klasy (public class ArrayUtils<E>
).Jeśli kompilator skarży się na niejednoznaczność typu podczas wywoływania statycznej metody ogólnej (znowu nie jest to prawdopodobne w twoim przypadku, ale ogólnie mówiąc, na wszelki wypadek), oto jak jawnie wywołać statyczną metodę ogólną przy użyciu określonego typu (
_class_.<_generictypeparams_>_methodname_
):Dzieje się tak tylko wtedy, gdy kompilator nie może określić typu ogólnego, ponieważ np. Typ ogólny nie jest powiązany z argumentami metody.
źródło
Musisz przenieść parametr typu na poziom metody, aby wskazać, że masz metodę ogólną, a nie klasę ogólną:
źródło
Wyjaśnię to w prosty sposób.
Typy ogólne zdefiniowane na poziomie klasy są całkowicie niezależne od typów ogólnych zdefiniowanych na (statycznym) poziomie metody.
Kiedy zobaczysz powyższy kod w dowolnym miejscu, zwróć uwagę, że T zdefiniowane na poziomie klasy nie ma nic wspólnego z T zdefiniowanym w metodzie statycznej. Poniższy kod jest również całkowicie ważny i równoważny z powyższym kodem.
Dlaczego metoda statyczna musi mieć własne typy ogólne, oddzielne od metod Class?
Tak więc za każdym razem, gdy wywołujesz metodę statyczną,
JVM interpretuje to następująco.
Oba dają te same wyniki.
źródło