Разве суперкласс не называет переопределенный метод?

Какую версию транспортира вы используете? Синтаксис ElementFinder[] используется внутри транспортира и должен как-то скрыться. Это было проблемой в 5.2.0, но я считаю, что она исправлена ​​в текущей версии (5.4.2). Если вы посмотрите на исходный код, то в функции, которая его обрабатывает, есть изменение: Начиная со строки 550 ,

* @param {function(Array.)} fn
* @param {function(Error)} errorFn
*
* @returns {!webdriver.promise.Promise} A promise which will resolve to
*     an array of ElementFinders represented by the ElementArrayFinder.
*/
then(
    fn?: (value: ElementFinder[] | any[]) => T | wdpromise.IThenable,
    errorFn?: (error: any) => any): wdpromise.Promise {
      if (this.actionResults_) {
      return this.actionResults_.then(fn, errorFn);
} else {
  return this.asElementFinders_().then(fn, errorFn);
}
}

Тогда как раньше это было

[111 ]

Короче говоря, какая у вас версия и помогает ли обновление?

6
задан Rob 3 July 2015 в 02:04
поделиться

5 ответов

Возможно, вы пытаетесь использовать статические методы, которые не будут работать, поскольку они не будут переопределены.

Хороший способ проверки - добавить аннотацию @Override к bar.a () и посмотреть, выдает ли компилятор ошибку, что a () на самом деле ничего не перекрывает

9
ответ дан 8 December 2019 в 04:10
поделиться

Ваши два класса в разных пакетах? И объявлены ли ваши методы класса foo общедоступными, защищенными, приватными или пакетными локальными? Очевидно, что если они частные, это не сработает. Возможно, менее очевидно, если они являются локальными (то есть не имеют публичной / защищенной / закрытой области видимости), тогда вы можете переопределить их, только если вы находитесь в том же пакете, что и исходный класс.

Например:

package original;
public class Foo {
  void a() { System.out.println("A"); }
  public void b() { a(); }
}

package another;
public class Bar extends original.Foo {
  void a() { System.out.println("Overwritten A"); }
}

package another;
public class Program {
  public static void main(String[] args) {
    Bar bar = new Bar();
    bar.b();
  }
}

В этом случае , вы все равно получите «А». Если вы объявите оригинальный метод a () в публичном или защищенном Foo, вы получите ожидаемый результат.

10
ответ дан 8 December 2019 в 04:10
поделиться

Методы определены как статические? Это единственный способ получить такой результат. Я нашел хорошее объяснение этому здесь: http://faq.javaranch.com/view?OverridingVsHiding

1
ответ дан 8 December 2019 в 04:10
поделиться

Когда я запускаю следующее:

public class Program {
    public static void main(String[] args) {
        bar b = new bar();
        b.b();
    }
}

class foo {
    public void a() {
       System.out.printf("a");
    }
    public void b() {
        a();
    }
}

class bar extends foo {
    public void a() {
        System.out.printf("overwritten a");
    }
}

я получаю следующий вывод:

overwritten a

, что я и ожидал увидеть.

7
ответ дан 8 December 2019 в 04:10
поделиться

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

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

Для этого не нужно указывать новую аннотацию @Override. добавление аннотации просто указывает, что вы хотите переопределить, и вызовет предупреждение или ошибку, если это не переопределение. (Если вы, например, ошибочно написали название метода).

Пример Эндрю показывает, как это должно работать.

0
ответ дан 8 December 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: