Java 爪哇语:;无法引用内部类[…]内的非最终变量;,OSX和Windows的区别
我从一个在OS X上的Eclipse中开发的项目中得到了一些代码。问题是,当代码在Windows上运行时,我会收到错误消息,但在OS X上运行时却不会 以下是在程序的主要功能中完成的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
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)中运行不好。