无法在内部类中引用/修改非final变量

6

我遇到了一个错误:“在不同方法中定义的内部类中无法引用非最终变量ROLE”。我想将字符串roletype设置为下拉列表中选择的任何内容。如果不能按照我以下尝试的方式进行,那么我该怎么做呢?或者我只是在我的代码中犯了一些愚蠢的错误吗?

谢谢, Ravin

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.*;
import javax.swing.event.*;

public class Funclass extends JFrame {

    FlowLayout layout = new FlowLayout();
    String[] skillz = {"Analytical", "Numerical", "Leadership",
        "Communication", "Organisation", "Interpersonal"};
    String[] rolez = {"Developer", "Sales", "Marketing"};
    String[] Industries = {"Consulting", "Tech"};
    String R1, R2, R3, R4, roletype;

    public Funclass() {
        super("Input Interface");
        setLayout(layout);
        JTextField Company = new JTextField("Company Name");
        JComboBox TYPE = new JComboBox(Industries);
        JList skills = new JList(skillz);
        JComboBox role = new JComboBox(rolez);
        skills.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        add(TYPE);
        add(skills);
        add(role);
        add(Company);

        ROLE.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent event) {
                if (event.getStateChange() == ItemEvent.SELECTED) {
                    roletype = rolez[role.getSelectedIndex()];
                }
            }
        });
    }
}

4
编译器/集成开发环境真的对你那么无礼地喊叫了吗? - BalusC
我知道这很刻薄。作为惩罚,我一直在与其他人调情。 - Ravin
3个回答

2

您需要将role变量声明为final,以便内部类(ItemListener)可以访问它,代码如下:

final JComboBox role = new JComboBox(rolez); 

1
这样做不行,因为 roletype 也必须声明为 final - tskuzzy
那仍然不会起作用,因为他正在内部类中修改 roletype ;) - tskuzzy
2
tskuzzy -- 最终限制仅适用于访问在定义局部类的方法内部作用域中的变量。内部类仍然可以访问封闭类变量。 - Kal
@Kal:啊,抱歉,我以为roletype也在构造函数中声明了。 :) - tskuzzy

1
import java.awt.event.*;
import javax.swing.*;

public class Funclass extends JFrame {

    private static final long serialVersionUID = 1L;
    private String[] rolez = {"Developer", "Sales", "Marketing"};
    private String roletype;
    private JComboBox role;

    public Funclass() {
        role = new JComboBox(rolez);
        role.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent event) {
                if (event.getStateChange() == ItemEvent.SELECTED) {
                    roletype = role.getSelectedItem().toString();
                }
            }
        });
    }
}

0

要从内部类访问外部类中的变量,它们必须声明为final。因此,在这种情况下,role必须是final

编辑:roletype不需要声明为final,即使在内部类中访问它,因为它是一个类变量,而不是方法变量。


抱歉,我误读了代码,并认为roletype也在构造函数中声明。我已经编辑了我的答案并澄清了这一点。 - tskuzzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接