考虑以下方法:
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>>
,{ {1}},Class<PrintablePredicate>
,null
)
这周围有吗?谢谢!
注意:null
会返回类型:this.profileConditions.getItems()
进一步注意,参数化方法调用如下:
ObservableList<PrintablePredicate<Miner>>
并没有缓解这个问题。
答案 0 :(得分:1)
当我遇到这种问题时(将一个普通类转换为参数化的一个?)我使用双重转换,以绕过编译器抱怨。
所以在你的情况下我想你可以写
(Class<PrintablePredicate<Miner>>)(Class<?>) PrintablePredicate.class
将 PrintablePredicate.class 参数传递给bindContentBidirectional函数时。
编辑:我发现只是简单地将PrintablePredicate.class转换为Class(我不知道为什么,因为* .class已经是Class类型,所以我觉得似乎没有必要)或者在将它传递给方法之前将它分配给变量适用于这种情况(使用javac 1.8.0_25)。因此,您可能只需使用此代码而不是上面的代码:
(Class)PrintablePredicate.class
所以你的错误可能是由于类似于OpenJDK的编译器错误(是的,这没有意义,因为它是一个错误):https://bugs.openjdk.java.net/browse/JDK-8028682
作为总结然后在我的发现之后,这个“双重投射”技巧(或者只是将一个对象分配给一个变量)可以帮助你“让它更容易”让编译器在有bug时“理解”你的代码比如这个似乎(大声笑,我猜这有点好笑,但它只是告诉你,有时你甚至不能信任编译器)。