通用类型与给定的方法签名不兼容?

时间:2014-11-29 20:48:32

标签: java generics javafx jfxtras reification

考虑以下方法:

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>不适用于参数(StringnullClass<String>ObservableList<PrintablePredicate<Miner>>,{ {1}},Class<PrintablePredicate>null

这周围有吗?谢谢!

注意:null会返回类型:this.profileConditions.getItems()

进一步注意,参数化方法调用如下:

ObservableList<PrintablePredicate<Miner>>

并没有缓解这个问题。

1 个答案:

答案 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时“理解”你的代码比如这个似乎(大声笑,我猜这有点好笑,但它只是告诉你,有时你甚至不能信任编译器)。