2010-12-10 15 views
117

Poniżej znajduje się opis, w jaki sposób utworzyć klasę generyczną języka Java, aby dołączyć pojedynczy element do tablicy. Jak mogę uczynić appendToArray metodą statyczną. Dodanie statycznego do podpisu metody powoduje błędy kompilacji.Jak ustawić typową metodę Java?

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; 
     } 
} 
+0

Jakie błędy w kompilacji dostałeś? Dlaczego nie skorzystać z jednego ze standardowych kontenerów bibliotecznych? –

+1

Błąd kompilacji: Właściwie dodawałem niepoprawny modyfikator statyczny. Używanie kolekcji: Tak, użycie kolekcji byłoby idealne, ale pytanie nie dotyczy kolekcji a tablicy, mój przypadek użycia wymaga tablicy. –

+0

Zauważ, że będziesz musiał użyć odbicia (ZWYKŁEGO), aby zatrzymać kod klienta zgłaszający wyjątek w niektórych, ale nie we wszystkich okolicznościach (nice). Najlepiej unikać tablic referencyjnych. –

Odpowiedz

210

jedyną rzeczą, jaką możesz zrobić, to zmienić swój podpis

public static <E> E[] appendToArray(E[] array, E item) 

ważnych szczegółów:

wyrażeń Generic poprzednich wartości zwracanej zawsze wprowadzają (oświadczają), nowy typ rodzajowy zmienna.

Dodatkowo, zmienne typu pomiędzy typami (ArrayUtils) i statycznymi metodami (appendToArray) nigdy nie kolidują ze sobą.

Więc, co to oznacza: W mojej odpowiedzi <E> by ukryć E z ArrayUtils<E> jeśli metoda nie byłaby static. AND <E> nie ma nic wspólnego z E z ArrayUtils<E>.

celu odzwierciedlenia tego faktu lepszego, bardziej poprawną odpowiedzią byłoby:

public static <I> I[] appendToArray(I[] array, I item) 
+16

Należy również pamiętać, że nie ma absolutnie żadnego związku między zmienną typu "E" na poziomie klasy i statyczną zmienną typu "E". Uważam, że lepszym sposobem jest użycie innej nazwy zmiennej podczas deklarowania ogólnych metod, statycznych lub innych, wewnątrz klas ogólnych. –

+0

, ale w tym przypadku mogę przekazać jeden obiekt różnych typów do parametrów. Tak jak mogę przekazać tablicę Integer [] jako pierwszy parametr i element podwójny. – pinkpanther

+0

pinkpanther: Prawda, ale nie wyrządza żadnej szkody, ponieważ metoda statyczna działa tylko na obiekcie tablicowym, który jest przekazywany do niego przez parametr, więc jego elementy z pewnością mają poprawny typ. – Dabbler

7

Trzeba przenieść parametr typu na poziomie metody, aby wskazać, że masz sposób ogólny raczej niż klasa ogólna:

public class ArrayUtils { 
    public static <T> E[] appendToArray(E[] array, E item) { 
     E[] result = (E[])new Object[array.length+1]; 
     result[array.length] = item; 
     return result; 
    } 
} 
57
public static <E> E[] appendToArray(E[] array, E item) { ... 

Uwaga na <E>.

Statyczna metoda generyczna wymaga własnej deklaracji ogólnej (public static <E>), oddzielonej od ogólnej deklaracji klasy (public class ArrayUtils<E>).

Jeśli kompilator narzeka na niejednoznaczność typu podczas wywoływania statycznej metody generycznej (znowu nie jest prawdopodobne w twoim przypadku, ale, ogólnie mówiąc, na wszelki wypadek), oto jak jawnie wywołać statyczną metodę generyczną przy użyciu określonego typu (_class_.<_generictypeparams_>_methodname_):

String[] newStrings = ArrayUtils.<String>appendToArray(strings, "another string"); 

to stałoby się tylko wtedy, gdy kompilator nie może określić typ rodzajowy, bo np typ ogólny nie jest powiązany z argumentami metody.

Powiązane problemy