tifyty

pure Java, what else ?

Interfész implementálás, level ninja

Aki ezt a blogot olvassa az mind tudja, hogy mi Java-ban az interface implementálás (vagy unatkozó nagymama). Azt is körbejártuk, hogy hogyan lehet többszörös öröklődést csinálni, ami nem csak interfészektől örököl többszörösen, hanem valóban mixin jellegű többszörös öröklődést valósít meg.

Azzal sincs már gondunk, hogy vajon a Java megengedi-e, hogy két interfész ugyanazt a metódust definiálja, és mi mind a kettőt implementáljuk az osztályunkban egy metódusban. Arról is esett már talán szó, hogy a Java azért sem haragszik, ha két olyan interfészt is megpróbálunk implementálni, amelyekben inkompatibilis metódusok szerepelnek: csak éppen nem fog menni.

Ez ugye az az eset, amikor

interface1:

     Integer a();

interface2:

     String a();

class:

class Z implements interface1, interface2 {...

A fordítónak itt sem azzal van a baja, hogy nem implementálhatjuk mind a két interface-t, csak azzal, hogy nem sikerül. Vagy az egyiket implementáljuk, vagy a másikat, a visszatérési érték Java nyelvben nem része a metódus aláírásnak.

És akkor most jön a kérdés hétvégére:

Hogyan fordulhat olyan elő, hogy egy osztályunk implementálni akar két interface-t, a két interface-ben nincsenek egymást “ütő” metódusok, a Java compiler mégsem engedi meg, hogy mind a két interface-t implementáljuk.

Hogy még egyszerűbb legyen a dolog: I1 és I2 interface-k egyike sem definiál egyetlen metódust sem, sem direk módon, sem pedig öröklődésen keresztül. A C osztály pedig csak ennyi:

public class C implements I1, I2{

}

És mégsem fordul le. Mi lehet?

8 responses to “Interfész implementálás, level ninja

  1. kirunewsKirály Péter május 31, 2013 1:56 du.

    Egyszerű: Z1 és Z2 nem is létezik (csak I1 és I2 van) 😉

  2. Markert Laci május 31, 2013 2:07 du.

    “Aki ezt a blogot olvassa az mind tudja, hogy mi Java-ban az interface implementálás.”
    nem is.

  3. Kofa május 31, 2013 3:09 du.

    Az Eclipse compilerben opcionális hiba a “Redundant super interface” (ha I1 extends I2, akkor I1 megvalósítása I2 megvalósítását is jelenti). Ha tehát be van kapcsolva ez az opció, akkor
    “Redundant superinterface I1 for the type C, already defined by I2”
    hibát kapunk. Ez viszont csak opcionális, a javac megeszi, és az eclipsec is, ha külön nem tiltod.
    Más most nem jut eszembe (feltéve, hogy C külön-külön implementálhatja őket, tehát nincs láthatósági probléma (nem publikus interface vagy default package használatával okozott importálhatatlanság miatt)).

  4. Kofa május 31, 2013 3:34 du.
    public interface S<T> {}
    public interface I1 extends S<String> {}
    public interface I2 extends S<Number> {}
    

    The interface S cannot be implemented more than once with different arguments: S<String> and S<Number>

  5. Peter Verhas május 31, 2013 11:55 du.

    Hát ez elég gyorsan meglett. Nekem már csak az marad a hétvégére, hogy elkészítsem a blogot arról, hogy mi volt az a pattern, ami ezt nekem előhozta, és talán némi magyarázat, hogy miért is nem implementálhatja az S osztályt különböző argumentumokkal az én kis osztályom.

    Addig is, ismételjük át a generikusokat, és gondoljuk végig, hogy pontosan mit jelent az, hogy run-time nincsenek generikusok, csak a forrásban. Tényleg nincsenek? Vagy azért a byte-code-ban benne van, csak a változók nem hordozzák? Hogy is van ez?

  6. Visszajelzés:Ninja implementálás, level interfész | tifyty

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: