Ich traf gerade diesen „Bug“, aber ich bin nicht sicher, ob dies beabsichtigt ist: Code:Warum wird InvokeLater im Haupt-Thread ausgeführt?
public static Object someMethod(){
assert SwingUtilities.isEventDispatchThread();
return new Object();
}
public static void main(String[] args){
SwingUtilities.invokeLater(() -> someMethod().toString());//First Example
SwingUtilities.invokeLater(someMethod()::toString);//Second Example
}
Im ersten Beispiel someMethod
auf dem Schaukel Thread ausgeführt wird, aber im zweiten Beispiel es ist nicht, obwohl es meiner Meinung nach sein sollte.
Ist das ein Fehler oder ist das beabsichtigt?
Es sieht so aus, als ob die Methodenreferenz das richtige Objekt oder die richtige Klasse als erstes Argument benötigt, nicht irgendeine Art, sie zu erhalten, also wird die Methode im Hauptthread aufgerufen, die die Assertion unterbricht. Ohne Assertion würde das Ergebnis der Methode verwendet werden, um 'methodResult :: toString' zu erzeugen, was äquivalent zu'() -> methodResult.toString() 'ist. – Pshemo
Wo ist der Fehler? Im zweiten Aufruf wird 'someMethod()' selbst im 'main'-Körper (also im' main'-Thread) ausgewertet, und dann wird ein Verweis auf die 'toString'-Methode des resultierenden Objekts an 'invokeLater' übergeben '. – RealSkeptic
Siehe auch [Was ist der äquivalente Lambda-Ausdruck für 'System.out :: println'] (https://stackoverflow.com/a/28025717/2711488) ... – Holger