Java Class.getConstructor未能找到兼容的构造函数

Java Class.getConstructor未能找到兼容的构造函数,java,reflection,Java,Reflection,由于工厂类存在问题,我传入了一个人类可读的名称,该名称映射到一个具有单个构造函数和单个参数的类,我得到以下错误: java.lang.NoSuchMethodException: com.satgraf.evolution2.observers.VSIDSTemporalLocalityEvolutionObserver.<init>(com.satlib.evolution.ConcreteEvolutionGraph) at java.lang.Class.getConstruc

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

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 class ConcreteEvolutionGraph extends ConcreteCommunityGraph implements EvolutionGraph{
    ...
}

getConstructor
要求参数类型完全匹配;它不会试图找到“兼容”构造函数。简单地说,“要反映的构造函数是该类对象表示的类的公共构造函数,其形式参数类型与
parameterTypes
指定的参数类型匹配”(在当前OpenJDK中,
getConstructor
getConstructor0
constructor.getParameterTypes()

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


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

很有趣,谢谢。最后,我确实传入了EvolutionGraph,我一直希望有一个更通用的选项,因为我有第二个函数,它接受一个稍微不同的参数,但这必须要做。
public class VSIDSTemporalLocalityEvolutionObserver extends JPanel implements EvolutionObserver{
    public VSIDSTemporalLocalityEvolutionObserver(EvolutionGraph graph){
    ...
    }
...
}
public class ConcreteEvolutionGraph extends ConcreteCommunityGraph implements EvolutionGraph{
    ...
}