Друзья,вопрос про ССЫЛКУ НА НЕСТАТИЧЕСКИЙ МЕТОД ЛЮБОГО ОБЪЕКТА(это один из 4 частных случаев)
Сказано,что можно заменить реализацию интерфейса ссылкой на метод,ЕСЛИ этот метод возвращает ТОТ ЖЕ ТИП и имеет такое же КОЛЛИЧЕСТВО параметров.Окей,с этим утверждением я согласен.
Только почему можно написать такую ссылку
" IntGenerator::next " ?
у этого же метода НОЛЬ параметров, а у public int getNext(IntGenerator gen);
ОДИН параметр,значит нельзя использовать такую ссылку на метод
public interface Test{
public int getNext(IntGenerator gen);
}
public class IntGenerator{
public int next(){
return 0;
}
}
ВЕЗДЕ в инете один ответ(я его не понял и приведу контр пример): ссылка НА НЕСТАТИЧЕСКИЙ МЕТОД ЛЮБОГО ОБЪЕКТА IntGenerator::next
будет являться реализацией указанного интерфейса , если в методе интерфейса Test
public int getNext(IntGenerator gen);
тип первого параметра IntGenerator gen
будет совпадать с типом класса(IntGenerator)
, у которого мы вызовем ссылку на метод, ТАК КАК в методе int next() есть НЕЯВНЫЙ параметр this
,который указывает на объект своего класса. Теперь чудесным образом у нас
у обоих методов ЯКОБЫ совпадает количество входящих параметров
int next(IntGenerator this)
public int getNext(IntGenerator gen)
И тут можно было бы согласиться, НООО давайте посмотрим на это под другим углом, если в методе
int next(IntGenerator this)
есть неявная ссылка на объект текущего класса, тогда она должна быть и в методе класса,который реализует интерфейс "Test"
public int getNext(Test this, IntGenerator gen)
ИЗ ЭТОГО СЛЕДУЕТ В ОДНОМ МЕТОДЕ 1 ПАРАМЕТР, А В ДРУГОМ ИХ 2(ДВА)!!!!!!!!!!!!
Тогда почему мы можем использовать данную ссылку на метод, сигнатуры же ЯКОБЫ не совпадают!!!!