Angenommen, ich habe ein paar Schnittstellen mit genau einer abstrakten Methode. Nachdem diese Schnittstellen kann ich lambda damit erklären:Lambdas auf bestimmten Schnittstellen beschränken
interface A {
int c();
}
interface B {
int c();
}
public class Main {
public static void main(String... args) {
A a =() -> 42;
B b =() -> 42;
}
}
Kurze Frage: Gibt es einen Trick oder Hack mit Schnittstelle A
für Lambda-Ausdrücke zu beschränken und die Build auf Versuch fehlschlagen, dies zu tun? Jeder Hinweis, ob schmutzig oder nicht, ist willkommen (mit 'schmutzig' meine ich Hacks auf Kompilierungs-/Bytecode-Ebene - etwas, das Quellen und vorzugsweise öffentliche Verträge nicht beeinflusst).
Lange Geschichte: für einige Schnittstellen Implementierer halte ich die Definition equals/hashCode
als Teil des Vertrages. Außerdem erstelle ich equals/hashCode
automatisch für sie zur Erstellungszeit.
In diesem Zusammenhang sind Lambdas Unruhestifter. Für normale und anonyme Implementierer der Schnittstelle A
kann ich eine .class
Datei und Instrument seinen Bytecode zur Erstellungszeit finden. Für Lambdas gibt es eine VM-anonyme Klasse, die zur Laufzeit erzeugt wird. Das Beeinflussen einer solchen Klasse scheint zur Zeit des Aufbaus unmöglich zu sein, daher muss ich solche Gelegenheiten für bestimmte Schnittstellen zumindest verbieten.
Ich habe schon alle Gründe bei "Long story" beschrieben. Ist es nicht detailliert genug? – skapral
Nun, ein Lambda kann nicht 'equals' und' hashCode' haben, da Sie sie überhaupt nicht definieren können. Warum also verbieten Sie, dass diese Schnittstelle als '@ FunctionalInterface' verwendet wird? – Eugene
@Eugene, stellen Sie sich vor, dass die Definition von equals und hashCode Teil des Vertrags ist, der von der Schnittstelle "A" bedient wird. Wie es in seinem Javadoc sagt - "müssen alle Implementoren von Schnittstelle A equals und hashCode definieren, die diesem und jenen Richtlinien folgen ... Werkzeug X kann sie für Sie erzeugen". Und dann kommt jemand mit lambdas und bricht gewaltsam den Vertrag, und Werkzeug X kann nichts dagegen tun. Als ich die Schnittstelle "A" definiert habe, habe ich nicht angenommen, dass es die funktionale Schnittstelle ist. Ich wollte, dass es nur eine Schnittstelle zu einer Methode ist. – skapral