Это ключевое слово в методе по умолчанию - PullRequest
0 голосов
/ 04 июля 2019

Я знаю, что мой вопрос глуп, но у меня в голове немного неясно.Я создал интерфейс, у которого есть метод по умолчанию, назовем его Dumb ().Я пытаюсь использовать this.argument где-то в этом методе, но это не сработало.Я знаю, что Интерфейс не может иметь экземпляров, но этот интерфейс реализован классом, назовем его A. У A есть экземпляр в основном методе с именем a, через который я вызываю мой метод Dumb () (a.Dumb ()).Мой вопрос: почему у меня не может быть этого, если я вызываю мой метод (который наследуется в конце концов)?это не ссылка на объект через вызов метода?И я также знаю, что переменная типа интерфейса может ссылаться на любой объект классов, реализующих этот интерфейс.

У меня есть смутное представление об этом вопросе, но ясное объяснение действительно поможет.Заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2019

Я интерпретирую вашу ситуацию так:

interface Foo {
  default int Dumb() {
    return 2*this.argument;
  }
}

class A implements Foo {
  int argument = 42;

  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.Dumb());
  }
}

и ваш вопрос как

A имеет поле argument, так почему я получаю эту ошибку:

Foo.java:4: error: cannot find symbol
    return this.argument;
               ^
  symbol: variable argument
1 error

Это потому, что Java требует, чтобы интерфейсы были действительны сами по себе. Они не могут ссылаться на необъявленные поля, даже если у всех реализующих классы есть поля с одинаковыми именами.

Это не похоже на JavaScript, где ссылки разрешаются во время выполнения, и в отличие от C ++, где шаблоны могут использоваться для разрешения ссылок на использование.

В Java вы бы вместо этого объявили, что все экземпляры Foo должны иметь способ получить интересующий вас аргумент, добавив (потенциально не стандартный) метод, который могут обеспечить реализации классов:

interface Foo {
  default int Dumb() {
    return 2*getArgument();
  }
  int getArgument();
}

class A implements Foo {
  int argument = 42;

  public int getArgument() {
    return argument;
  }

  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.Dumb());
  }
}
...