2013-07-29 6 views
6

Jeśli definiowania zmiennej, wydaje się być całkowicie poprawny zadeklarować/zdefiniować zmienną w następujący sposób:W języku Java, kiedy jest niepoprawna tablica {a, b, c, ...} i dlaczego?

double[][] output = {{0,0},{1,0}}; 

Ale jeśli powrocie wartość wydaje się być niepoprawny napisać następujące :

public double[] foo(){ 
     return {0,1,2} 
    } 

Myślałbym, że wewnętrznie, obaj wykonaliby tę samą akcję. Eclipse, przynajmniej, nie zgadza się. Czy ktokolwiek wie, na czym polega różnica i gdzie indziej może być widziany, lub dlaczego korzystne byłoby przyjęcie poprzedniego przykładu i odrzucenie tego ostatniego?

Edycja: dobra, więc jest to właściwe podczas inicjalizacji, ale nie widzę żadnej niejasności ... JVM nie może interpretować typu zmiennej z nazwy zmiennej (w przypadku przedefiniowania) już zainicjowane zmienne) lub po powrocie (gdzie JVM może po prostu przyjrzeć się typowi zwracanej funkcji)? Co powoduje, że inicjalizacja jest specjalnym przypadkiem reguły, która uniemożliwiłaby typ niejawny? Co sprawia, że ​​ogólna reguła wymaga jawnego typu?

Odpowiedz

5

Jest to dopuszczalne tylko podczas deklaracji. Możesz jednak użyć new double[] {0, 1, 2}.

na trasę §10.6:

inicjator tablica może być określone w zgłoszeniu, lub jako część wytworem ekspresji tablicy.

Wyrażenie tworzenia tablicy to składnia new double[] { }.

+0

"Jest to dopuszczalne tylko podczas deklaracji." Czemu? Dlaczego nie podczas zwrotu? –

+0

@JohnP Ponieważ język na to nie pozwala. O ile mi wiadomo, nie ma dobrego argumentu przeciwko niemu (domyślam się, że kompilator musiałby wykonać nieco więcej wnioskowania o typie, aby upewnić się, że tworzenie jest bezpieczne). – Jeffrey

12

Możesz używać nawiasów klamrowych tylko w miejscu deklaracji, gdzie kompilator może wywnioskować typ tablicy z typu deklaracji.

Aby używać go nigdzie indziej trzeba użyć Array Creation Expression:

return new double[] {0,1,2}; 
+0

"Aby użyć go w innym miejscu, musisz użyć wyrażenia tworzenia tablicy". Czemu? Dlaczego w instrukcji return nie można użyć tej samej notacji? –

+0

@JohnP. Ponieważ program Java Language Creator zaprojektował go w ten sposób. Zobacz [JLS Section 10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6). –

+0

Nie, nie sądzę. Gdybym zapytał, dlaczego ptaki rozwinęły pióra zamiast futra, powiedzenie "ponieważ stwórca zrobił to w ten sposób" byłoby nigdzie niezadowalające, prawda? Bardziej prawdopodobne jest, że przyjmę odpowiedź Jeffreya wyłącznie dlatego, że błagałaś. –

Powiązane problemy