Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传递子类的构造函数参数时出现“无法解析匹配构造函数”错误_Java_Spring_Inheritance_Constructor - Fatal编程技术网

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() {
            // ....
        }
    }