Ich habe eine einfache interpretierte Sprache mit dynamischer Typisierung in Java implementiert. Leider stieß ich auf folgendes Problem. Wenn Sie den folgenden Code zu testen:Interpretierte Sprache in Java und Aufrufe von Java-Methoden
def main() {
def ks = Map[[1, 2]].keySet();
return ks.size();
}
stieß ich auf die folgende Ausnahme:
java.lang.IllegalAccessException: class is not public: java.util.HashMap$KeySet.size()int/invokeSpecial
Natürlich durch die Tatsache Dies gilt und verursacht, dass HashMap $ KeySet Klasse „Paket“ Sichtbarkeit. Das heißt, wenn ich die Methode "size()" aufrufe, rufe ich die Methode aus der Klasse auf, die für meinen Code nicht sichtbar ist. Java vermeidet dieses Problem ganz einfach - die Methode keySet() gibt den Wert des Typs Set zurück, also wird die verwendete Methode size() in der öffentlichen und der abstrakten Klasse "Set" deklariert.
Meine Frage ist: Hat jemand eine Idee, wie dies in generischer Weise behandelt werden soll? Unter „Allgemein“ Fall meine ich nicht nur diese einfachen Fall, wo ich durch ganze Vererbungskette gehen und „erste Erklärung“ dieser Methode finden, sondern auch pathologische Fälle wie folgt aus:
interface I1 {
public void foo();
}
interface I2 {
public void foo();
}
interface I3 {
public void foo();
}
class C implements I1, I2, I3 {
public void foo() { .... }
}
Mein aktueller Eindruck ist, dass ich diese pathologischen Fälle ignorieren und jede passende Methode wählen könnte, wenn ein solches Objekt existiert, dann ist die Erstellung erfolgreich, also ist die Kompilierung erfolgreich, also haben alle diese Methoden identische Signaturen und da in Java gibt es keine Möglichkeit zu spezifizieren Je nachdem wie das Objekt betrachtet wird (wie I1, I2 oder I3), wird das Ergebnis immer dasselbe sein.
Jede Hilfe wird geschätzt.
Sie sollten wahrscheinlich versuchen, die Auflösungsregeln der Java-Methode zu emulieren, außer dass Sie es zur Laufzeit anstatt zur Kompilierzeit tun würden. Im Grunde genommen müssten Sie die erste Methode in der Vererbungsstruktur (die am nächsten zur Wurzel) betrachten, und wenn es mehrere gibt, wählen Sie diejenige, die von einer Oberklasse kommt. Wenn sie alle von Schnittstellen kommen, können Sie beliebig wählen. – biziclop
Eine verwandte Frage ist jedoch, wie all dies mit Standardmethoden funktionieren würde. – biziclop
Vielleicht ist es nicht klar aus meinem Beitrag, aber das ist genau das, was ich gerade implementiere, ich bin mir einfach nicht sicher, ob das die Lösung ist. Vielleicht gibt es einen besseren Weg, weshalb ich gefragt habe. Natürlich könnte ich es einfach so lassen, denn dynamisches Tippen ist nur eine Phase für dieses Projekt, da ich statische Typisierung mit Typendifferenzierung anstrebe, aber es mit einem solchen klaffenden Loch zu verlassen, kann ich nicht mit gutem Gewissen tun. –