/ Problém s rozhraním java - java

java rozhranie problém - java

Číslo: -

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. }

-Am nie je schopný pochopiť z riadku číslo 14 až 16. pretože som nikdy nevidel taká vec fubar vnútri jeden method.Will nejaký orgán, prosím, vysvetliť 14-16 žiadna linka?

odpovede:

3 pre odpoveď č. 1

Toto sa nazýva anonymná vnútorná trieda, Nová trieda s názvom generovaným z kompilátorov sa vytvára v mieste, ktoré robíte new Foo() { ... }, Táto nová trieda implementuje Foo rozhranie. Je zhruba ekvivalentom:

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()
);
}
}

(Predpokladám, že medzi tým chýba priestor new a Foo vo vašom príklade je chyba.)


3 pre odpoveď č. 2

Riadok je nesprávny. Mal by mať priestor medzi "novým" a "Foo":

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

Tým sa vytvorí inštancia anonymného typu, ktorý implementuje Foo, vidieť Java v skratke: anonymné triedy (časť 3.12.3 sa vzťahuje na syntax).

Anonymné triedy sa často používajú s poslucháčmi udalostí. vidieť Swing Trail: Vnútorné triedy a anonymné vnútorné triedy (ale ignorujte Vnútorné triedy popísané v hornej časti tejto sekcie ;-)

Happy kódovanie.


Pre komentár:

Riadok 14 je začiatok volania metódy fubar (ktorý je definovaný vyššie ako public int fubar(Foo foo)). Poznač si to new ... je výraz (anonymný typ alebo nie) a výsledok tohto výrazu (nový objekt) sa odovzdá ako argument fubar, Formátovanie je väčšinou ľubovoľné - mohlo to byť všetko na jednej línii. Zvážte tento kód:

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

Dúfam, že to vyrieši.


2 pre odpoveď č. 3

Nazýva sa to anonymná vnútorná trieda. Vytvárate implementáciu Foo počas letu namiesto toho, aby ste museli napísať pomenovanú triedu.

Tu je potenciálne užitočná otázka SO o tom, čo sú a kedy ich budete chcieť používať.