Я не понимаю порядок компиляции в этой последовательности кода [дубликат]

Из примечаний к выпуску Xcode 3 beta 3:

«статические» методы и свойства теперь разрешены в классах (в качестве псевдонима для «final final»).

Итак, в Swift 1.2 hi(), определенном как

class foo {
  static func hi() {
    println("hi")
  }
}

, используется метод типа (т. е. метод, который вызывается самим типом), который также final (т.е. нельзя переопределить в подклассе).

-1
задан talex 16 January 2019 в 10:11
поделиться

2 ответа

x.proc(z) выбирают из методов типа x (то есть X) во время компиляции. Единственный доступный метод - proc(X).

Также имейте в виду, что public void proc(Z p) в Z не отменяет public void proc(X p).

0
ответ дан talex 16 January 2019 в 10:11
поделиться

Вы получаете этот результат, потому что ваши proc методы не перекрывают друг друга.

Самый простой способ увидеть это - добавить @Override -аннотацию:

static class Z extends Y {
    public Z() {
        v += 9;
    }

    @Override
    public void proc(Z p) {
        System.out.println(34);
    }
}

Это не удастся скомпилировать с сообщением об ошибке

Метод proc ( Test.Z) типа Test.Z должен переопределить или реализовать метод супертипа

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

Чтобы исправить ошибку и переопределить метод для получения ожидаемого результата, вы можете изменить тип параметра на X:

static class Z extends Y {
    public Z() {
        v += 9;
    }

    @Override
    public void proc(X p) {
        System.out.println(34);
    }
}

Теперь он снова компилируется и выдает 34.


В вашем примере произошло то, что вместо переопределения ваш класс Z добавил перегруженный метод void proc(Z p) в дополнение к к методу void proc(X p) из X. Разрешение перегрузки основано на типе времени компиляции, поэтому только метод из X доступен и выбирается. Этот метод переопределен в Y, так что это то, что фактически выполняется во время выполнения.

Следовательно, другой способ получить ожидаемый результат - оставить X, Y и Z без изменений и изменить тип ссылки x на Z:

public static void main(String[] args) {
    Z x = new Z();
    Y y = new Z();
    Z z = new Z();
    x.proc(z);//// 1
    System.out.println(y.getV());
}
[ 1131] Эта версия вызывает перегруженный метод из Z, потому что это наиболее специфическая перегрузка для параметра типа Z.

0
ответ дан Hulk 16 January 2019 в 10:11
поделиться
Другие вопросы по тегам:

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