我刚刚遇到了这个“错误”,但是我不确定这是否是故意的:代码:
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 }
在第一个示例中,someMethod它是在swing线程上执行的,但在第二个示例中,它不是,尽管我认为应该这样做。
someMethod
这是错误还是故意的?
在我看来,这似乎是您的误解
第一行就像在说:“好吧,秋千,我想要你做的invokeLater是someMethod().toString()”。所以Swing执行它
invokeLater
someMethod().toString()
第二行就像是说:“确定,Swing,我要您执行的invokeLater是方法toString()返回的对象的方法someMethod()”。一个someMethod()是方法, 我现在执行
toString()
someMethod()
所以结果对我来说完全合乎逻辑
请记住,在评估函数(在本例中为invokeLater)之前,Java需要评估所有参数。因此,在第一种情况下,Java评估lambda函数(无需执行),在第二种情况下,它遇到方法调用, 因此需要执行它