2017-06-26 4 views
2

Angenommen, ich habe Methoden, die einen Rückgabetyp von Objekt und Schnittstellentyp abc haben.Schnittstelle als Referenzvariable

class xyz 
    { 

    Object meth() 
    { 
     ... 
    } 

    abc meth2() 
    { 
     ... 
    } 

    public static void main (String args[]) 
    { 
     xyz x = new xyz() ; 

     Object a = x.meth() ; 

     abc c = x.meth2() ; 
    } 
} 

Ich möchte nicht die Schnittstelle abc implementieren. Die Referenzvariable c ist vom Typ abc, aber was ist der Objekttyp für c? Wir können keine Objekte einer Schnittstelle erstellen, also was könnte es sein?

Zum Beispiel: sup s = new sub(); // where sub ist Unterklasse von sup. Hier sup ist der Rückgabetyp und sub ist der Objekttyp.

+0

haben Wie planen Sie, die Methode 'meth2' zu implementieren, ohne ein Objekt von' abc' zu erstellen, wenn Sie 'null' zurückgeben? Im letzteren Fall ist der Wert von "c" gleich "null". – anacron

+2

Bitte halten Sie sich an Java Namenskonventionen (wie 'Abc' für einen Typ) und identifizieren Sie Ihren Code – c0der

+0

Wenn Sie ein Objekt vom Typ' abc' wollen, müssen Sie _eine Klasse definieren, die es implementiert (obwohl es eine anonyme Klasse sein könnte). Ich bin mir nicht sicher, wie Sie gedacht haben, dass Sie etwas Nützliches tun könnten, ohne die Schnittstelle zu implementieren. – ajb

Antwort

1

Der zugrunde liegende Typ von c kann alles sein, was abc implementiert. Der tatsächliche Typ hängt von Ihrer Implementierung von meth2 ab.

"Aber in meinem Code implementiert nichts abc obwohl!" du sagtest. Wenn nichts implementiert abc, meth2 kann nicht implementiert werden. Es kann nie einen korrekten Wert zurückgeben, da es keinen Typ erstellen kann, der mit abc kompatibel ist, wenn keine Typen abc implementieren.

jedoch in meth2, können Sie schaffen, was eine „anonyme Klasse“ genannt wird:

return new abc() { 
    // all the methods required by abc will be put here... 
}; 

Beim Übersetzen dieser anonyme Klasse wird in eine innere Klasse der umgebenden Klasse gedreht werden, die abc implementiert, und es wird den voll qualifizierten Namen von etwas wie yourpackage.EnclosingClass$1

0

Um Ihre Frage zu beantworten, müssen Sie zuerst über die möglichen Wege nachdenken, die meth2() zu schreiben. Sie müssen die ABC-Schnittstelle irgendwo implementieren. Sie können etwas tun:

ABC meth2() { 

    return new ABC(){ 
     // Implement the methods that are defined in ABC interface 
    }; 
} 
0

Verfahren meth2 nur null oder eine Instanz einer Klasse der Umsetzung der Schnittstelle abc zurückkehren kann.

Verwandte Themen