2016-09-16 40 views
11

Ostatnio from this question nauczyłem się, że następujący wydaje się być java prawna:Java: Użycie "this" jako nazwy argumentu/parametru metody instancji?

class Bar { 
    void foo(Bar this) {} 
} 

Teraz Próbowałem dowiedzieć się, gdzie w standardzie Java mówi, że mogą to zrobić, i spojrzał here ale nie można znaleźć sekcji.

Czy ktoś może cytować, gdzie pozwala na tę formę deklaracji metody i jakie są ograniczenia deklarowania argumentu o nazwie this?

+0

To jest fajne. Ponieważ wiedziałem, że próbowałem wymyślić tło "JLS"; ale moje początkowe leniwy próby nie powiodło się. I dzięki tobie, teraz wiem! – GhostCat

Odpowiedz

12

Jest on ważny w wersji 1.8 lub nowszej JDK.

A oto JLS saying that

Parametr odbiornik jest opcjonalne urządzenie składniowym dla metody przykład wykonania konstruktora lub klasa wewnętrzna jest. W przypadku metody instancji parametr receive reprezentuje obiekt, dla którego wywołana jest metoda. Dla konstruktora klasy wewnętrznej parametr odbiornika reprezentuje natychmiast zamykające się wystąpienie nowo skonstruowanego obiektu. Tak czy inaczej, parametr odbiornika istnieje wyłącznie w celu umożliwienia oznaczenia typu reprezentowanego obiektu w kodzie źródłowym, aby typ mógł być opatrzony komentarzem.

Jeśli czytać pełne wypunktowania można znaleźć poniżej imp notatek,

Jeżeli parametr odbiornik jest dozwolone, jego typ i nazwa są określone w następujący sposób:

  • W metodzie instancji typem parametru receive musi być klasa lub interfejs , w którym deklarowana jest metoda, oraz nazwa parametr odbiornika musi być taki; w przeciwnym razie wystąpi błąd podczas kompilacji .

  • W konstruktorze wewnętrzną klasa, typ parametru odbiornika musi być klasy lub interfejsu, który jest natychmiast załączając oświadczenie rodzaj wewnętrznej klasy oraz nazwę parametru odbiornik musi być Identifier . to gdzie Identyfikator jest prostą nazwą klasy lub interfejsu, który jest bezpośrednio otaczającą deklaracją typu wewnętrznego klasy; w przeciwnym razie wystąpi błąd podczas kompilacji .

+0

Huh ... jaki był powód tej zmiany? Nie ma potrzeby, aby móc nazwać parametr "to". – Gikkman

+2

@ Gikkman Ostatnie zdanie wyjaśnia, dlaczego: * parametr odbiornika istnieje wyłącznie w celu umożliwienia oznaczenia typu reprezentowanego obiektu w kodzie źródłowym, ** tak, aby typ może być opatrzony komentarzem **. * Chociaż myślę, że to naprawdę znaczy: tak, że (niejawny) * parametr * może być adnotowany. – Andreas

+1

Czytałem twoją edycję jak 5 razy i nadal nie rozumiem.Zgaduję, że znalazłem coś, czego potrzebuję, aby zajrzeć dalej tutaj, dzięki :-) – Gikkman

Powiązane problemy