Java 爪哇语:;无法引用内部类[…]内的非最终变量;,OSX和Windows的区别

Java 爪哇语:;无法引用内部类[…]内的非最终变量;,OSX和Windows的区别,java,eclipse,windows,macos,Java,Eclipse,Windows,Macos,我从一个在OS X上的Eclipse中开发的项目中得到了一些代码。问题是,当代码在Windows上运行时,我会收到错误消息,但在OS X上运行时却不会 以下是在程序的主要功能中完成的 Mainbus mainbus = new Mainbus(); (new Thread(new Runnable(){ @Override public void run(){ MatlabProxyConnection matlabpro

我从一个在OS X上的Eclipse中开发的项目中得到了一些代码。问题是,当代码在Windows上运行时,我会收到错误消息,但在OS X上运行时却不会

以下是在程序的主要功能中完成的

Mainbus mainbus = new Mainbus();    

    (new Thread(new Runnable(){
        @Override
        public void run(){
            MatlabProxyConnection matlabproxy = new MatlabProxyConnection();
            mainbus.setMatlabProxyConnection(matlabproxy);
            matlabproxy.startMatlab("quiet");
        }
    })).start();
当我尝试在Windows上运行代码时,会收到一条错误消息:

“无法在中定义的内部类中引用非最终变量 另一种方法。”


Windows上的Eclipse似乎更严格;这实际上是代码中的一个错误,必须修复。让它在两个系统上都工作的最佳解决方案是什么?将mainbus的声明更改为final是最好的解决方案,还是应该定义一个新的类实现线程,以便在构造函数中传递mainbus?

只需设置
mainbus
final即可

final Mainbus mainbus = new Mainbus();  

只需设置
mainbus
final

final Mainbus mainbus = new Mainbus();  
最终的限制后来放宽到未分配给的局部变量,也就是说,该变量本可以成为最终变量。那就定下来吧

主要原因是,在runnable中,实际上使用了一个新变量
mainbus
,因为这两个变量(存储对象指针的内存地址)具有不同的生命周期

对于(嵌套的)lambda用法、参数,需要进行松弛

最终的限制后来放宽到未分配给的局部变量,也就是说,该变量本可以成为最终变量。那就定下来吧

主要原因是,在runnable中,实际上使用了一个新变量
mainbus
,因为这两个变量(存储对象指针的内存地址)具有不同的生命周期


对于(嵌套的)lambda用法、参数,需要放宽限制。

所有悬垂的括号是怎么回事
???但问题可能是因为您在Windows中使用较低版本的JDK…在Java8中,
mainbus
被认为是有效的最终版本,因为您没有重新分配它…但在以前的版本中并非如此…因此错误…可能只是设置或eclipse版本。关于最终版本,以防万一您不打算将另一个
Mainbus()
实例重新分配给
Mainbus
,只需将其设置为最终版本即可。上面的代码在OSX上的Eclipse中给出了一个警告。你们都是对的。在OS X上是Mars版本,在Windows上是Juno版本,它似乎不支持Java 8。再加上Java 8允许“有效的最终”变量,代码在EclipseMars(编译器遵从性级别1.8)中运行良好,但在EclipseJuno(级别1.7)中运行不好(???但问题可能是因为您在Windows中使用较低版本的JDK…在Java8中,
mainbus
被认为是有效的最终版本,因为您没有重新分配它…但在以前的版本中并非如此…因此错误…可能只是设置或eclipse版本。关于最终版本,以防万一您不打算将另一个
Mainbus()
实例重新分配给
Mainbus
,只需将其设置为最终版本。上面的代码在OSX上的Eclipse中给出了一个警告。你们都是对的。在OS X上是Mars版本,在Windows上是Juno版本-它似乎不支持Java 8。再加上Java 8允许“代码在EclipseMars(编译器遵从性级别1.8)中运行良好,但在EclipseJuno(级别1.7)中运行不好。