Как с 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());
Здесь - суть. Кто-нибудь знает, почему это недействительно и, надеюсь, обходное решение?
К вашему сведению, я не заинтересован в размышлениях.
@khachik Я пробовал это и еще несколько вариантов с? оператор, но результат тот же :(




Я предполагаю, что ваш конструктор ожидает 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, который работает, если учетная запись является MetaObject, но не подклассом.
У меня нет доступа к компьютеру в данный момент, поэтому я не могу проверить, но думаю, что
public MetaProperty(Function<? extends MetaObject, MetaProperty<P>> propertyGetter)должен это исправить