Конечные переменные не могут быть назначены во вложенном типе - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь создать приложение OAuth, но у меня проблема.Можно ли как-нибудь преобразовать String во что-нибудь (в данном случае «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.

РЕДАКТИРОВАТЬ

В любом случае, я смог исправить ошибку (используязначение верификатора).Спасибо за вашу помощь.

Ответы [ 7 ]

3 голосов
/ 18 июня 2011

Вы можете назначать конечные переменные только в объявлении или в конструкторе. В этом смысл последнего ключевого слова - переменная доступна только для чтения.

1 голос
/ 18 июня 2011

Верификатор является конечной переменной, и как только вы назначите в нее что-либо, вы не сможете присвоить ей другое значение, так что лучше объявить и присвоить значение за один раз

0 голосов
/ 18 июня 2011

Ошибка точно говорит вам, в чем заключается ваша проблема: вы сделали новую переменную верификатора переменной «Verifier» (какой бы черт это ни было), и вы пытаетесь присвоить строку, возвращаемую из getValue () метод в эту переменную. Так как только у вас есть код для класса Verifier, вам нужно проверить, можете ли вы каким-либо образом добавить информацию String в переменную. Есть ли у него метод setText (...)? Не лучше ли использовать переменную Verifier, а не String?

0 голосов
/ 18 июня 2011

Вы можете присвоить значение конечной переменной, но компилятор должен быть уверен, что вы не получите доступ к переменной до ее присвоения и не будете переназначать ее. В этом случае ваша проблема заключается в том, что у вас есть код, который будет выполняться последовательно, а событие - нет. Функция 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 () возвращает String, и вы пытаетесь присвоить его переменной Verifier. Я думаю, вы неправильно понимаете API этой библиотеки.

0 голосов
/ 18 июня 2011

Для вашего нового вопроса, нет, вы не можете изменить тип переменной, кроме как на подкласс или тот, который реализует интерфейс.

Почему бы просто не объявить «верификатор» как String?

0 голосов
/ 18 июня 2011

Как и выше, финал не может быть назначен дважды.

Для ее решения вы можете

  • Объявите переменную "verifyier" как переменную экземпляра (в классе, но не в любом методе), поэтому к ней можно обращаться в анонимном классе, не будучи финальной, или

  • Объявите переменную «верификатор» как поле в объекте и установите значение с помощью установщика. Поэтому вы избегаете назначения окончательной переменной дважды.

    final MyVerifier verifier = new MyVerifier();
    ...
    public void onClick(ClickEvent event) {
        verifier.setValue(txtbxHello.getValue());
    }
    
0 голосов
/ 18 июня 2011

вы установили переменные "verifyier" и "txtBxHello" как окончательные (могут быть назначены только один раз), поэтому вы не можете переназначить их.

- это то, на что жалуется компилятор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...