gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:50 25 4
gpt4 key购买 nike

给出以下方法:

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,因为泛型类型没有具体化。换句话说,bindContentBidirectory 的给定方法签名与所有 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);
}

编译器说:

The method bindContentBidirectional(String, String, Class<?>, ObservableList<E>, Class<E>, SelectionModel<E>, String) in the type BeanPathAdapter<MinerMonitorProfile> is not applicable for the arguments (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参数传递给bindContentBidirection函数时。

<小时/>

编辑:我发现简单地将 PrintablePredicate.class 转换为 Class (但我不明白为什么,在我看来这似乎有点不必要,因为 *.class 已经是 Class 类型)或在将其传递给方法之前将其分配给变量适用于这种情况(使用 javac 1.8.0_25)。因此,也许你应该使用这个而不是上面的代码:

(Class)PrintablePredicate.class

所以你的错误可能是由于与 OpenJDK 中的这个类似的编译器错误造成的(是的,这没有意义,因为它是一个错误):https://bugs.openjdk.java.net/browse/JDK-8028682

<小时/>

作为我的发现之后的总结,这种“双重转换”技巧(或者只是将对象分配给变量)可以帮助您“让编译器更容易”“理解”您的代码,当它有这样的错误时(哈哈,我猜必须这样做有点有趣,但它只是向您表明有时您甚至不能信任编译器)。

关于java - 通用类型与给定的方法签名不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com