gpt4 book ai didi

java - Class.getConstructor 找不到兼容的构造函数

转载 作者:行者123 更新时间:2023-11-30 03:27:14 33 4
gpt4 key购买 nike

由于工厂类存在问题,我传入了一个人类可读的名称,该名称映射到具有单个构造函数和单个参数的类,我收到以下错误:

java.lang.NoSuchMethodException: com.satgraf.evolution2.observers.VSIDSTemporalLocalityEvolutionObserver.<init>(com.satlib.evolution.ConcreteEvolutionGraph)
at java.lang.Class.getConstructor0(Class.java:2892)
at java.lang.Class.getConstructor(Class.java:1723)
at com.satlib.evolution.observers.EvolutionObserverFactory.getByName(EvolutionObserverFactory.java:84)
at com.satgraf.evolution2.UI.Evolution2GraphFrame.main(Evolution2GraphFrame.java:229)

这些是有问题的类,我在不同的项目中有大约一打这样的东西,它们都可以正常工作 - 包括一个几乎相同的类,不明白为什么这个失败:

public EvolutionObserver getByName(String name, EvolutionGraph graph){
if(classes.get(name) == null){
return null;
}
else{
try {
Constructor<? extends EvolutionObserver> con = classes.get(name).getConstructor(graph.getClass());
EvolutionObserver i = con.newInstance(graph);
observers.add(i);
return i;
}
catch (InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException | IllegalArgumentException | SecurityException ex) {
Logger.getLogger(EvolutionObserverFactory.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
}

正在实例化的类是:

public class VSIDSTemporalLocalityEvolutionObserver extends JPanel implements EvolutionObserver{
public VSIDSTemporalLocalityEvolutionObserver(EvolutionGraph graph){
...
}
...
}

参数graph的类型为:

public class ConcreteEvolutionGraph extends ConcreteCommunityGraph implements EvolutionGraph{
...
}

最佳答案

getConstructor 要求参数类型完全匹配;它不会尝试找到“兼容”的构造函数。 getConstructor Javadoc只是说“要反射(reflect)的构造函数是此 Class 对象表示的类的公共(public)构造函数,其形式参数类型与 parameterTypes 指定的类型匹配。” (在当前的 OpenJDK 中,getConstructor delegates to getConstructor0 其中 loops through all the constructors and compares the given parameter array 针对 constructor.getParameterTypes()。)

在运行时,您的代码会查找采用 ConcreteEvolutionGraph 类型参数的构造函数(graph.getClass() 返回 graph 的运行时类型),而 VSIDSTemporalLocalityEvolutionObserver 没有。

如果您确实正在寻找采用 EvolutionGraph 的构造函数,请将 EvolutionGraph.class 传递给 getConstructor。相反,如果您想要任何可以使用图形的运行时类型调用的构造函数,则需要手动循环 getConstructors() 的结果,查找 graph 的单参数构造函数.getClass().isAssignableTo(ctor.getParameterTypes()[0])。请注意,可能有多个接口(interface),并且当涉及接口(interface)时,可能没有最具体的接口(interface)。你必须决定如何打破联系。

关于java - Class.getConstructor 找不到兼容的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908407/

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