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