/ / problem z interfejsem java - java

problem z interfejsem java - java

Kod:-

10. interface Foo { int bar(); }
11. public class Sprite {
12.     public int fubar( Foo foo) { return foo.bar(); }
13.     public void testFoo() {
14.         fubar(
15.             new Foo() { public int bar(){ return 1; } }
16.         );
17.     }
18. }

- Nie jestem w stanie zrozumieć z linii numer 14 do 16., ponieważ nigdy nie widziałem czegoś takiego w jednej metodzie. Jakiekolwiek ciało proszę wyjaśnić 14-16 bez linii?

Odpowiedzi:

3 dla odpowiedzi № 1

To się nazywa anonimowa klasa wewnętrzna. Nowa klasa, z nazwą generowaną przez kompilator, jest tworzona w miejscu, w którym się znajduje new Foo() { ... }. Ta nowa klasa implementuje Foo berło. Z grubsza odpowiada to:

interface Foo { int bar(); }
public class Sprite {
public int fubar( Foo foo) { return foo.bar(); }
public class MyFoo implements Foo {
public int bar() { return 1; }
}
public void testFoo() {
fubar(
new MyFoo()
);
}
}

(Przyjąłem, że brakująca przestrzeń między new i Foo w twoim przykładzie jest błąd.)


3 dla odpowiedzi № 2

Linia jest błędna. Powinien mieć spację między "nowym" i "Foo":

new Foo() { public int bar(){ return 1; } }

Tworzy to wystąpienie anonimowego typu, który implementuje Foo. Widzieć Java w skrócie: Anonymous Classes (sekcja 3.12.3 obejmuje składnię).

Anonimowe klasy są często szeroko używane ze słuchaczami zdarzeń. Widzieć Swing Trail: klasy wewnętrzne i anonimowe klasy wewnętrzne (ale ignoruj ​​Klasy Wewnętrzne omówione na początku tego rozdziału ;-)

Szczęśliwe kodowanie.


Do komentarza:

Linia 14 jest początkiem wywołania metody fubar (co zdefiniowano powyżej jako public int fubar(Foo foo)). Zauważ, że new ... jest wyrażeniem (typ anonimowy lub nie) i wynik tego wyrażenia (nowy obiekt) jest przekazywane jako argument fubar. Formatowanie jest w większości arbitralne - mogło to być wszystko w jednym wierszu. Rozważ ten kod:

Foo aNewFoo = new Foo() { ... };
fuubar(aNewFoo);

Mam nadzieję, że to wszystko wyjaśni.


2 dla odpowiedzi nr 3

Nazywa się to anonimową klasą wewnętrzną. Tworzysz implementację Foo w locie, zamiast pisać nazwaną klasę.

Oto potencjalnie przydatne pytanie SO o tym, czym są i kiedy zechcesz ich użyć.