我在尝试根据下面给出的代码写入变量时得到了上述错误。
我知道我可以通过全局声明变量(mPager)并使其成为最终来解决这个问题。但是我不想让它成为最终版本而且我想知道为什么会发生这样的错误并且是否有其他修复而不是在全局或最终声明?
public class fieldsActivity extends Activity {
Button addSiteButton;
Button cancelButton;
Button signInButton;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// to create a custom title bar for activity window
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.fields);
// use custom layout title bar
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);
Pager adapter = new Pager();
ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager); //Variable of CONCERN
mPager.setAdapter(adapter);
mPager.setCurrentItem(1);
addSiteButton = (Button) findViewById(R.id.addSiteButton);
addSiteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPager.setCurrentItem(2, true); //Compilation error happens here.
}
});
答案 0 :(得分:1)
标准方式java(在java 8中它可能不同)处理闭包。据我所知,当有内部类时,编译器通过自动生成的构造函数创建变量的副本,而不是变量本身。然后,为了不在内部类中和外部存在不一致,变量必须是最终的,否则一个部分可能具有变量的过时状态。除非你把它变成全球性的,否则。
相关帖子:
Why are only final variables accessible in anonymous class?