2016-03-31 6 views
0

Ich rufe eine Methode von einer API, die ein Set-Objekt zurückgibt. Soweit ich weiß, ist ein Set eine Schnittstelle, und Sie können eine Schnittstelle nicht instanziieren. Ich bin in der Lage, dieses Set zu nehmen und anArray() darauf zu rufen. Was kommt dann wirklich zurück?Wie kann eine Methode ein Set in Java zurückgeben?

+7

Die Methode gibt eine Instanz einer Klasse zurück, die die 'Set'-Schnittstelle implementiert. Siehe [Polymorphismus] (https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29) – khelwood

Antwort

5

Es macht einen Set zurückkehren, aber Sie müssen verstehen, dass ein Set mehr als nur die Schnittstelle ist:

Jede Implementierung von jeder Klasse, die Set implementiert zurückgegeben werden können.

public Set getMySet(){ 
    return new HashSet(); 
} 

seit HashSet implementiert Set, gilt dies Code, der funktioniert.

Das Schreiben von Anwendungen auf Schnittstellen und nicht auf deren Implementierung ist eine weit verbreitete Praxis. Nach allem, was Sie brauchen, um Ihren Code zu schreiben (und zu testen) (zum Beispiel die Benutzeroberfläche, die einen Dienst verwendet), ist die Schnittstelle.

Sie können nicht die konkreten Implementierungen noch bekommen, können sie nicht einmal existieren noch, aber man kann schon die ganze Arbeit Sie tun müssen.

+0

, so dass der Entwickler, der die Methode erstellt hat, es so entworfen hat, dass er ein Objekt zurückgibt, das die Set-Schnittstelle implementiert hat. Da die Methode ein Set zurückgibt, kann ich auswählen, welches Objekt das Set sein soll? So wie der Entwickler ein HashSet-Objekt zurückgeben kann, aber kann ich TreeSet sagen ts = methodThatReturnsSet()? –

+1

@brentryczak Nein. Sie können die empfangene Menge in einen anderen Typ konvertieren, wenn Sie möchten, aber der Methodenrückgabetyp sagt Ihnen "Ich werde etwas zurückgeben, das' Set' implementiert, und Sie sollten nicht wissen, welche Implementierung es ist ist zufälligerweise." – khelwood

+0

also meine Optionen sind, eine Methode direkt aus der return-Anweisung aufzurufen, die die Schnittstelle enthält (zB methodThatReturnsSet(). SomeMethod(), oder um sie in eine Klasse umzuwandeln, die sie implementiert (zB TreeSet ts = (TreeSet) methodThatReturnsSet()) –

1

Das Zurückgeben einer Schnittstelle von einer Methode bedeutet, dass das zurückgegebene Objekt diese Schnittstelle implementiert.

In diesem Fall bedeutet dies, dass das zurückgegebene Objekt 'Set' implementiert. Sie können Methoden aufrufen, die in dieser Schnittstelle enthalten sind, aber Methoden der implementierenden Klasse nicht aufrufen können.