Java 不能在封闭类型中分配最终变量

Java 不能在封闭类型中分配最终变量,java,oauth,Java,Oauth,我正在尝试创建一个OAuth应用程序,但我遇到了一个问题。是否有任何方法可以将字符串转换为任何内容(在本例中为“Verifier”,我的库强制使用它,否则会将非法字符发送到服务器) 这是守则中重要的部分: final Verifier verifier = null; final TextBox txtbxHello = new TextBox(); Button btnSubmit = new Button("Submit"); btnSubmit.addClickHandler(new

我正在尝试创建一个OAuth应用程序,但我遇到了一个问题。是否有任何方法可以将字符串转换为任何内容(在本例中为“Verifier”,我的库强制使用它,否则会将非法字符发送到服务器)

这是守则中重要的部分:

final Verifier verifier = null;
final TextBox txtbxHello = new TextBox();
Button btnSubmit = new Button("Submit");
  btnSubmit.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        verifier = txtbxHello.getValue();
    }
  });
Token accessToken = service.getAccessToken(requestToken,verifier);
错误是:

Type mismatch: cannot convert from String to Verifier.
编辑

无论如何,我能够修复错误(使用verifier的值)

谢谢您的帮助。

您只能在声明或构造函数中分配最终变量。这就是final关键字的含义-变量是只读的。

您只能在声明或构造函数中分配final变量。这就是final关键字的含义-变量是只读的。

您已将变量“verifier”和“txtBxHello”设置为final(只能分配一次),因此无法重新分配它们

这就是编译器所抱怨的。

您已将变量“verifier”和“txtBxHello”设置为final(只能分配一次),因此无法重新分配它们


这正是编译器所抱怨的。

验证器是最终变量,一旦你在其中赋值,你就不能在其中赋值,所以最好一次声明并赋值。

验证器是最终变量,一旦你在其中赋值,你就不能在其中赋值,所以最好声明并赋值在once

中,如上文所述,final不能分配两次

要解决这个问题,你可以

  • 将变量“verifier”声明为实例变量(在类中,但不在任何方法中),因此可以在匿名类中访问它,而不必是final,或者

  • 将变量“verifier”声明为对象中的字段,并通过setter设置值。因此,可以避免两次指定最终变量

    final MyVerifier verifier = new MyVerifier();
    ...
    public void onClick(ClickEvent event) {
        verifier.setValue(txtbxHello.getValue());
    }
    

如上所述,期末考试不能分配两次

要解决这个问题,你可以

  • 将变量“verifier”声明为实例变量(在类中,但不在任何方法中),因此可以在匿名类中访问它,而不必是final,或者

  • 将变量“verifier”声明为对象中的字段,并通过setter设置值。因此,可以避免两次指定最终变量

    final MyVerifier verifier = new MyVerifier();
    ...
    public void onClick(ClickEvent event) {
        verifier.setValue(txtbxHello.getValue());
    }
    

对于您的新问题,您不能更改变量的类型,除非更改为子类或实现接口的类型


为什么不将“verifier”声明为字符串?

对于您的新问题,您不能更改变量的类型,除非更改为子类或实现接口的类型


为什么不将“验证器”声明为字符串?

您可以为最终变量赋值,但编译器必须确保在赋值之前您不会访问该变量,也不会重新赋值。 在这种情况下,您的问题是,您的代码将按顺序执行,而事件将不按顺序执行。onClick函数将在将来的某个时间执行。 也许你想要这个:

final TextBox txtbxHello = new TextBox();
Button btnSubmit = new Button("Submit");
btnSubmit.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        final Verifier verifier = txtbxHello.getValue();
        Token accessToken = service.getAccessToken(requestToken,verifier);
    }
});

但另一方面,TextBox.getValue()返回一个字符串,您尝试将其分配给验证器变量。我认为您误解了该库的API。

您可以为最终变量赋值,但编译器必须确保您不会在赋值之前访问该变量,也不会重新赋值。 在这种情况下,您的问题是,您的代码将按顺序执行,而事件将不按顺序执行。onClick函数将在将来的某个时间执行。 也许你想要这个:

final TextBox txtbxHello = new TextBox();
Button btnSubmit = new Button("Submit");
btnSubmit.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        final Verifier verifier = txtbxHello.getValue();
        Token accessToken = service.getAccessToken(requestToken,verifier);
    }
});

但另一方面,TextBox.getValue()返回一个字符串,您尝试将其分配给验证器变量。我认为您误解了该库的API。

错误正好告诉您问题所在:您已将新的验证器变量设置为“验证器”变量(不管是什么),并试图将getValue()方法返回的字符串分配给该变量。因此,由于只有您拥有Verifier类的代码,您需要检查是否可以以某种方式将字符串信息添加到变量中。它有setText(…)方法吗?不使用验证器变量而使用字符串变量会更好吗

错误确切地告诉您问题所在:您已经将新的验证器变量设置为“验证器”变量(不管是什么),并且您正在尝试将getValue()方法返回的字符串分配给该变量。因此,由于只有您拥有Verifier类的代码,您需要检查是否可以以某种方式将字符串信息添加到变量中。它有setText(…)方法吗?不使用验证器变量而使用字符串变量会更好吗

请理解,您的问题与Eclipse无关。你已经有了不可编译的代码,而且非常简单。如前所述,您无法在尝试更改最终变量时进行更改。相反,您可能希望将verifier设置为类字段。我已经尝试过了,错误是:无法对非静态字段verifierClass进行静态引用。verifier这表明您需要学习有关如何创建和使用对象的教程和文本,这是Java编程中的一个基本概念。验证器变量需要是非静态或实例变量,并且上面的代码应该在非静态或实例方法中调用。再次,请阅读如何创建和使用实例(非静态)变量和方法,因为在使用Java之前,您需要了解这一点。你已经有了不可编译的代码,而且非常简单。如前所述,您无法在尝试更改最终变量时进行更改。相反,您可能希望将verifier设置为类字段。我已经尝试过了,错误是:无法对非静态字段verifierClass进行静态引用。verifier这表明您需要学习有关如何创建和使用对象的教程和文本,这是Java编程中的一个基本概念。你的