Java: Справочник по неверному методу с загадкой

Как с JDK 1.8.0_181, так и с JDK 10.0.2 я получаю эту ошибку компиляции:

test\Account.java:[13,88] error: incompatible types: invalid method reference

Для этого объявления переменной:

public final MetaProperty<Integer> BALANCE_PROP_INVALID = new MetaProperty<Integer>(Account::getBalance);

Но этот и компилируется, и работает нормально:

public final MetaProperty<Integer> BALANCE_PROP_VALID = new MetaProperty<>(account -> ((Account) account).getBalance());

Здесь - суть. Кто-нибудь знает, почему это недействительно и, надеюсь, обходное решение?

К вашему сведению, я не заинтересован в размышлениях.

У меня нет доступа к компьютеру в данный момент, поэтому я не могу проверить, но думаю, что public MetaProperty(Function<? extends MetaObject, MetaProperty<P>> propertyGetter) должен это исправить

khachik 03.10.2018 21:17

@khachik Я пробовал это и еще несколько вариантов с? оператор, но результат тот же :(

Jason 03.10.2018 21:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что ваш конструктор ожидает Function<Object, T> или аналогичный. У него нет возможности узнать, что вы намеревались создать Учетную запись. Один из способов обойти это - сделать класс двумя универсальными.

class MetaProperty<A, R> {
    MetaProperty(Function<A, R> getter) { /* */ }
}

 public static final MetaProperty<Account, Integer> BALANCE_PROP_INVALID 
                                                    = new MetaProperty<>(Account::getBalance);

Ты хороший!!! Это сделало это. Я думал, что указание MetaObject в ctor сделало бы это, так как Account расширяет MetaObject, но, очевидно, не играет в кости. Спасибо, Питер!

Jason 03.10.2018 21:26

@Jason, который работает, если учетная запись является MetaObject, но не подклассом.

Peter Lawrey 04.10.2018 09:20

Другие вопросы по теме