Общие типы несовместимы с данной сигнатурой метода?

1

Учитывая следующий метод:

public <E> void bindContentBidirectional(final String fieldPath,
        final String itemFieldPath, final Class<?> itemFieldPathType,
        final ObservableList<E> list, final Class<E> listValueType,
        final SelectionModel<E> selectionModel,
        final String selectionModelItemMasterPath)

Правильно ли я понимаю, что если у меня есть ObservableList<PrintablePredicate<SomeClass>> как тип:

final ObservableList<E> list

(то есть E = PrintablePredicate<SomeClass> что это никогда не будет работать, потому что для следующего аргумента:

final Class<E> listValueType) 

Я могу написать только PrintablePredicate.class, а не PrintablePredicate.class, поскольку общие типы не повторяются. Другими словами, данная сигнатура метода для bindContentBidirectional несовместима со всеми E, так что E имеет общие аргументы типа.

Объединяя все это в конкретном сценарии, скажем, у нас есть:

@FXML private CheckListView<PrintablePredicate<Miner>> profileConditions;      
private MinerMonitorProfile minerMonitorProfile;

private void initialize() {
    BeanPathAdapter<MinerMonitorProfile> minerMonitorProfileBPA = new BeanPathAdapter<>    (this.minerMonitorProfile);
    minerMonitorProfileBPA.bindContentBidirectional("conditions", null, String.class, this.profileConditions.getItems(), PrintablePredicate.class, null, null);
}

компилятор говорит:

Метод bindContentBidirectional(String, String, Class<?>, ObservableList<E>, Class<E>, SelectionModel<E>, String) в типе BeanPathAdapter<MinerMonitorProfile> не применим для аргументов (String, null, Class<String>, ObservableList<PrintablePredicate<Miner>>, Class<PrintablePredicate>, null, null)

Во всяком случае, вокруг? Благодарю!

Примечание: this.profileConditions.getItems() возвращает тип: ObservableList<PrintablePredicate<Miner>>

Обратите внимание, что параметризация вызова метода как в:

minerMonitorProfileBPA.<PrintablePredicate<Miner>>bindContentBidirectional("conditions", null, String.class, this.profileConditions.getItems(), PrintablePredicate.class, null, null);

не устраняет проблему.

Теги:
generics
javafx
jfxtras
reification

1 ответ

1
Лучший ответ

Когда у меня возникают подобные проблемы (листинг простого класса для параметризованного?), Я использую двойное кастинг, чтобы обойти жалобу компилятора.

Так что в вашем случае, я думаю, вы могли бы написать

(Class<PrintablePredicate<Miner>>)(Class<?>) PrintablePredicate.class

при передаче параметра PrintablePredicate.class функции bindContentBidirectional.


Edit: Я узнал, что просто отбрасывая PrintablePredicate.class в Class (я не понимаю, почему, хотя, кажется, это кажется ненужным по моему мнению, поскольку *.class уже имеет тип Class) или присваивает его переменной, прежде чем передавать его в метод работает для этого случая (с использованием javac 1.8.0_25). Поэтому, возможно, вам стоит просто использовать это вместо кода выше:

(Class)PrintablePredicate.class

Таким образом, ваша ошибка может быть связана с ошибкой компилятора, подобной этой, с OpenJDK (да, это не имеет смысла, потому что это ошибка): https://bugs.openjdk.java.net/browse/JDK-8028682


В качестве сводки, после моих выводов, этот трюк с двойным кастингом (или просто назначение объекта переменной) может помочь вам "упростить", чтобы компилятор "понял" ваш код, когда у него есть ошибка, такая как эта один кажется (LOL, это смешно делать, что я думаю, но это просто показывает вам, что иногда вы даже не можете доверять компилятору).

  • 0
    Это действительно сработало. Большое спасибо. Случайно у вас (или у кого-то еще) есть какие-то ресурсы, где я мог бы узнать об этом, казалось бы, волшебном двойном кастинге? Спасибо =)
  • 0
    К сожалению, я никогда не читал об этом, это всего лишь уловка, которую я узнал однажды, когда боролся с такой проблемой. Я добавлю больше информации к ответу, пытаясь объяснить, что делает трюк.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню