有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java类。getConstructor找不到兼容的构造函数

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

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{
    ...
}

共 (1) 个答案

  1. # 1 楼答案

    getConstructor要求参数类型完全匹配;它不会试图找到“兼容”构造函数。^{} Javadoc简单地说,“要反映的构造函数是这个类对象所表示的类的公共构造函数,它的形式参数类型与parameterTypes指定的类型匹配。”(在当前的OpenJDK中,getConstructor{a2}{}它loops through all the constructors and compares the given parameter array对抗constructor.getParameterTypes()。)

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

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