Я интерпретирую вашу ситуацию так:
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());
}
}