Das wie erwartet funktioniert nicht (da ich ein Paket privaten run
von außen Services
rufen versuche):Scala: sichtbare Methoden durch Strukturtypen außerhalb des Pakets Zugriff Paket
object Services {
class HelloPrinter {
private[Services] def run = "Hello"
}
}
val obj = new Services.HelloPrinter
Aber überraschenderweise das funktioniert:
val obj: {def run: String} = new Services.HelloPrinter
obj.run
ich würde sagen, da sein um einen Fehler in dem Compiler als HelloPrinter den Strukturtyp wegen Paket Sichtbarkeitsregeln nicht übereinstimmt, ist es überhaupt nicht kompilieren soll! Hier
ist ein Fall, in dem das Programm kompiliert, aber es wirft eine Laufzeitausnahme (java.lang.NoSuchMethodException
):
class HelloPrinter {
private[HelloPrinter] def run = "Hello"
}
val obj: {def run: String} = new HelloPrinter
obj.run
Ist dies eine Sprache-Funktion oder ausschließen mir fehlt oder berechtigterweise einen Fehler in Scala?
Sehr interessant. Hast du versucht mit "scala -feature" REPL zu laufen? Es zeigt deutlich, dass ein reflektierender Aufruf aufgerufen wird. Ich denke, Scoping und Unveränderbarkeit sind alle aus dem Fenster, wenn es um die Reflexion geht. – marios
Nun, soweit ich das beurteilen kann, soll die Warnung eher dazu dienen, Sie vor den möglichen Leistungsfolgen zu warnen. Mein Verständnis ist, dass trotz der Verwendung von Reflektion, um den eigentlichen Aufruf zur Laufzeit durchzuführen, strukturelle Typisierung (angeblich) wie statisch typisiert ist wie alles andere in scala, weil der Compiler überprüft, dass die Signaturen genau übereinstimmen (und somit nur der reflektierende Aufruf gelingen). Es sei denn, Sie führen einen expliziten Downcast zu einem Strukturtyp durch. Da hier jedoch kein Cast vorliegt, scheint der Compiler die Sichtbarkeit der Methode einfach zu überspringen. –
Das zweite Beispiel, das Sie sagen, wirft eine 'NoSuchMethodException' kompiliert nicht für mich (in 2.10.4 und 2.11.6 REPL). –