【问题标题】:Can I call a static method from my constructor's body to get at the instance instead of calling Super?我可以从构造函数的主体中调用静态方法来获取实例而不是调用 Super 吗?
【发布时间】:2016-10-11 11:06:35
【问题描述】:

我想扩展 ArrayAdapter 但调用

ArrayAdapter.createFromResource(context,textArrayResId,textViewResId);

而不是

super(context,textArrayResId,textViewResId)

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

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

public class myArrayAdapter<CharSequence> extends ArrayAdapter {

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

    }
}

【问题讨论】:

  • 好吧,如果您不明确调用超级构造函数并且如果有默认构造函数可用,它会隐式调用super(),或者您需要指定您想要的超级构造函数称呼。这是多态性的一部分..
  • 你想通过调用ArrayAdapter.createFromResource实现什么?这里的目的不是很明显。
  • 不,不是。要初始化子类,必须先初始化超类。如果不存在默认构造函数,则必须调用参数化构造函数。

标签: java android android-layout listview oop


【解决方案1】:

在这种情况下必须显式调用父类构造函数。您可以为此创建静态工厂方法。

What are static factory methods?

【讨论】:

    【解决方案2】:

    来自JLS, § 8.8.7

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

    这意味着必须调用超类构造函数。隐式调用始终引用super()。如果此构造函数不存在,则必须显式调用超类构造函数。

    要回答您的问题:您必须显式调用构造函数。调用静态方法没有帮助。但是,您可以查看createFromResource(...) 的代码,它应该以ArrayAdapter 的构造函数调用结束。

    【讨论】:

      【解决方案3】:

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

      您正在扩展一个对象,而您不会让它被创建!!!

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

      在您的情况下,您可以删除 extend ArrayAdapter 以便它成为一个工厂类,为您创建一个 ArrayAdapter 类型的对象;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 2013-03-05
        • 2013-08-24
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多