2014-02-05 29 views
0

我有以下类别:“无法解析匹配构造函数”传递时错误构造带参数的子类

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> 

问题是当服务器启动时,我得到以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ivpluginHealthCheckTest' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities) 

看到错误,我尝试加载g不同的属性,但没有运气。我结束了这样的事情:

<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有麻烦调用继承构造函数来实例化类?我能做些什么来完成这项工作?

回答

5

calling an inherited constructor to instantiate the class?

构造函数永远不会被继承,它没有任何意义。构造函数只是初始化该特定类中的状态。您不能指望Parent的构造函数初始化Child类的状态。这只是Child类中构造函数的作用。

所以,不,你不能做你想做的事情。这不是Spring的问题。这非常重要。

+1

它不像你发出声音那么明显。我们假设所有的方法都是通过从类继承而来的,而构造函数定义在技术上是一种方法,所以我可以看到怎么会认为有可能继承构造函数方法。 –

+0

@MohammadS。嗯。是啊,你说得对。删除了我的答案的那部分。 –

+0

你在说什么是有道理的。有一次,我只在父类中留下了默认的构造函数,而在子类中没有任何内容,并且它抛出了异常。我想这是因为默认构造函数暗含超级调用(除非我也误解了这一点)。这只是让我觉得其他的也被继承了。 – dnc253

2

简答:构造函数不是用Java继承的。

JLS

Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding. 

这意味着你必须申报所需要的每个子类的构造函数,并调用相应的超级构造函数。即使它具有相同的签名,它也不算作重写。

0

如果你不提供你的孩子类的构造函数,编译器插入一个无参数的构造函数,并把第一行调用超无参数的构造 所以,你的代码变为: -

public class ChildClass extends ParentClass { 

     public ChildClass() { 
      super(); 
     } 
    } 

显然,U纷纷抛出一个空指针异常可导致的疑难问题。建议你添加一个构造,使超constrcutor一个调用带String参数: -

public class ChildClass extends ParentClass { 
     public ChildClass(String id) { 
      super(id); 
     } 

     @Override 
     public void doInstanceStuff() { 
      // .... 
     } 
    } 

这应该解决所有的问题...

注意: - 如果您添加参数构造函数,编译器不会为您添加默认构造函数。

现在,您的bean将正确初始化,因为它将调用字符串参数构造函数。目前编译器正在为你提供一个默认的无参数构造函数,然后调用你的无参数父类构造函数,并抛出一个空指针异常..

相关问题