Может ли в Java 8 метод по умолчанию интерфейса обращаться к переменным экземпляра? - PullRequest
0 голосов
/ 07 февраля 2019

TL; TD В Java 8 есть способ для метода интерфейса по умолчанию для доступа к переменным экземпляра?

Например:

public interface Foo{
    default getBazModified(){
       return baz * 2; 
    }
}

public class Bar implements Foo {
   int baz;
   ...
}

Я знаю, что это звучит как travisty, но этоЕсть ли способ сделать что-нибудь подобное в Java 8?

Или единственный способ - это создать абстрактный класс, реализующий Foo, в котором объявлена ​​переменная экземпляра baz иреализация по умолчанию getBazModified () ?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Интерфейс не «видит» поля экземпляра своей реализации.Это не специфично для интерфейсов, любой супертип не будет знать об определенных полях своих подтипов (или о любом типе элемента в этом отношении).

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

public interface Foo{
    default int getBazModified(){
       return this.getBaz() * 2; 
    }

    int getBaz();
}

И пусть конкретный класс реализует метод получения:

public class Bar implements Foo {
   int baz;
   public int getBaz() {return this.baz;}
}
0 голосов
/ 07 февраля 2019

Нет.Поскольку переменные, используемые внутри метода интерфейса по умолчанию, имеют доступ только к переменным, определенным внутри интерфейса.

public interface Foo {
int BAZ=1;

default int getBazModified(){
    return BAZ * 2;
  }
}

Помните, что переменные, определенные внутри интерфейса, являются общедоступными, статическими и конечными, и их необходимо инициализировать.

Теперь,

public class Bar implements Foo {
  int BAZ = 10;
}

внутри вызывающего класса ..

 Foo foo = new Bar();
 System.out.print(foo.getBazModified()); // output: 2

Вы можете получить доступ к переменной экземпляра внутри класса "Bar" только путем переопределения метода по умолчанию.Вот так

public class Bar implements Foo {

  int BAZ = 10;

  @Override
  public int getBazModified() {
    return BAZ * 2;
  }
}

И знаете, если

Foo foo = new Bar();
System.out.print(foo.getBazModified()); // output: 20 (access instance variable)
0 голосов
/ 07 февраля 2019

Вы пытались его скомпилировать?Ответ - нет, потому что интерфейс не знает, будет ли вообще поле с именем 'baz' или нет.

Я знаю, это звучит как травистика, но есть ли способ сделать что-нибудь подобноев Java 8?

Да.Абстрактный класс.Это буквально то, для чего были разработаны абстрактные классы.

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