Java 传递子类的构造函数参数时出现“无法解析匹配构造函数”错误
我有以下课程:Java 传递子类的构造函数参数时出现“无法解析匹配构造函数”错误,java,spring,inheritance,constructor,Java,Spring,Inheritance,Constructor,我有以下课程: public abstract class ParentClass { public ParentClass() { throw new RuntimeException("An ID must be specified."); } public ParentClass(String id) { this(id, DEFUALT_ARG_VALUE); } public ParentCla
public abstract class ParentClass
{
public ParentClass()
{
throw new RuntimeException("An ID must be specified.");
}
public ParentClass(String id)
{
this(id, DEFUALT_ARG_VALUE);
}
public ParentClass(String id, int anotherArg)
{
this.id = id;
//stuff with anotherArg
}
public abstract void doInstanceStuff();
}
public class ChildClass extends ParentClass
{
@Override
public void doInstanceStuff()
{
//....
}
}
在我的应用程序上下文中,我有以下内容:
<bean id="myChildInstance" class="com.foo.bar.ChildClass " scope="singleton">
<constructor-arg value="myId" />
</bean>
看到错误,我尝试添加不同的属性,但没有成功。我的结局是这样的:
<bean id="myChildInstance" class="com.foo.bar.ChildClass " scope="singleton">
<constructor-arg value="myId" index="0" type="java.lang.String" name="id" />
</bean>
我仍然会犯同样的错误
我尝试将相同的构造函数添加到我的子类中,并使用每个构造函数的适当参数调用super,这似乎解决了这个问题。但是,我不想在我的所有子实例中添加相同的构造函数,而必须使用父类维护这些构造函数
Spring调用继承的构造函数来实例化类时遇到问题,有什么原因吗?我能做些什么来实现这一点吗?简短回答:构造函数在Java中不是继承的 从: 这意味着您必须声明每个子类所需的构造函数,并调用相应的超级构造函数。即使它有相同的签名,也不算是覆盖 调用继承的构造函数来实例化类 构造函数永远不会被继承,这也没有什么意义。构造函数只是初始化该特定类中的状态。不能期望父类的构造函数初始化子类的状态。这只是子类中构造函数的工作
所以,不,你不能做你想做的事。这不是Spring的问题。这是非常基本的 如果未在子类中提供构造函数,编译器将插入无参数构造函数,并将第一行作为调用添加到超级无参数构造函数中 因此,您的代码变为:-
public class ChildClass extends ParentClass {
public ChildClass() {
super();
}
}
显然,您抛出了一个空指针异常,这可能是导致问题的原因。我建议您添加一个构造函数并调用超级构造函数,该构造函数使用字符串参数:-
public class ChildClass extends ParentClass {
public ChildClass(String id) {
super(id);
}
@Override
public void doInstanceStuff() {
// ....
}
}
这会解决你所有的问题
注意:-如果添加参数构造函数,编译器不会为您添加默认构造函数
现在,bean将正确初始化,因为它将调用字符串参数构造函数。当前,编译器为您提供了一个默认的无参数构造函数,该构造函数反过来调用无参数父类构造函数,并抛出一个空指针异常。它不像您所说的那么明显。我们假设所有的方法都是通过从一个类扩展来继承的,而构造函数定义在技术上是一个方法,所以我可以看出人们是如何认为继承构造函数方法的。嗯,是的,你说得对。删除了我答案的那部分。你说的很有道理。有一次,我在父类中只留下了默认构造函数,在子类中没有留下任何内容,它确实抛出了异常。我想这是因为默认构造函数是隐含的超级调用,除非我也误解了这一点。这让我觉得其他构造函数也被继承了。@dnc253是的,如果您不提供任何构造函数,编译器将始终添加默认构造函数。@dnc253您是对的。子类中的隐式默认构造函数隐式调用super。因此,调用超级类的默认构造函数。
public class ChildClass extends ParentClass {
public ChildClass() {
super();
}
}
public class ChildClass extends ParentClass {
public ChildClass(String id) {
super(id);
}
@Override
public void doInstanceStuff() {
// ....
}
}