我可以从构造函数的主体调用静态方法来获取实例而不是调用Super吗?

时间:2016-10-11 11:06:36

标签: java android android-layout listview oop

我想扩展ArrayAdapter但是要调用

  

ArrayAdapter.createFromResource(上下文,textArrayResId,textViewResId);

而不是

  

超级(上下文,textArrayResId,textViewResId)

在myArrayAdapter构造函数中,但我总是得到一个没有默认构造函数可用于android.widget.ArrayAdapter 错误。

看起来必须调用超级是必须的,所以当我使用它时,代码编译得很好。我要求做的可能吗?

public class myArrayAdapter<CharSequence> extends ArrayAdapter {

    public myArrayAdapter(Context context, int textArrayResId, int textViewResId) {
       // super(context,textArrayResId,textViewResId);
        ArrayAdapter.createFromResource(context,textArrayResId,textViewResId);

    }
}

3 个答案:

答案 0 :(得分:2)

必须在此方案中显式调用父类构造函数。您可以为此创建静态工厂方法。

What are static factory methods?

答案 1 :(得分:1)

问题是,当你删除那一行时,编译器会尝试使用默认构造函数创建超级对象,因为在你的情况下你的超类没有任何默认的构造函数,这不会起作用。

你正在扩展一个物体而你不打算让它被创造!!!

你不能这样做。您必须调用超级构造函数才能创建实例。

在你的情况下你可以删除function submit(){ //Preexisting code hiddenInput.value=selectedImageInCarousel; return validateForm(); } 这样它就会变成一个工厂类,为你创建一个ArrayAdapter类型的对象;)

答案 2 :(得分:1)

来自JLS, § 8.8.7

  

构造函数体的第一个语句可能是对同一个类或直接超类的另一个构造函数的显式调用   [...]   如果构造函数体不以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,则构造函数体隐式地以超类构造函数调用开始&#34; super();&#34;,调用其直接超类的构造函数,不带参数。

这意味着必须调用超类构造函数。隐式调用始终引用for i, v in enumerate(alist[4:], 4): ... 。如果此构造函数不存在,则必须显式调用超类构造函数。

回答你的问题:你必须明确地调用构造函数。调用静态方法没有帮助。但是,您可以查看super()的代码,该代码应该在createFromResource(...)的构造函数调用中结束。