如何添加默认的构造函数

时间:2016-03-28 02:18:31

标签: java android constructor default-constructor android-lint

希望我不是在这里重复一个问题,但我在堆栈交换中发现的所有问题似乎都不符合我的需要。

以下是我的代码片段:

public class custom_row_adapter extends ArrayAdapter<Integer> {
     custom_row_adapter(Context context, ArrayList<Integer> picId, String url, String fullUrl) {
         super(context, R.layout.activity_custom_row_adapter, picId);
}
     //Do stuff

在应用程序中一切正常,现在我尝试生成一个签名的apk,我得到一个很好的小错误,我需要一个默认的构造函数。所以我决定加一个,现在我的代码看起来像这样:

public class custom_row_adapter extends ArrayAdapter<Integer> {
    public custom_row_adapter() {
        super();
}
     custom_row_adapter(Context context, ArrayList<Integer> picId, String url, String fullUrl) {
         super(context, R.layout.activity_custom_row_adapter, picId);
}
//Do Stuff

现在我收到一个新错误,它无法为ArrayAdapter()

找到合适的构造函数

所以我上google并找到一些帖子,其中一个告诉我,我可以通过在Inspections选项卡中搜索Instantiable并将其转为警告它将修复它来绕过该错误。没用。

那么我该如何解决这个问题呢?提前谢谢。

编辑:对于那些说我可以添加public custom_row_adpater(){}的人 enter image description here

编辑2 :这里有更多图片,请注意左下方的错误:

调试中有用:What works in Debug

Paul G的回答:Paul G's answer

Defualt构造函数:default constructor

没有构造函数:No constructor

6 个答案:

答案 0 :(得分:3)

此错误意味着由于某种原因,lint(错误地)认为您的适配器应该是可实例化的。这适用于可能由系统实例化的对象,如活动,广播接收器,但不适用于适配器,因为它们总是在应用程序的代码中实例化。例如,ArrayAdapterSimpleCursorAdapter等常用的适配器没有默认构造函数。

您可以尝试让Android Studio发挥作用,例如更新构建工具,清理工作区,删除build目录......如果它不起作用,您可以添加所请求的(和无用的)默认的构造函数:

public custom_row_adapter() {
    super(null , 0);
    throw new RuntimeException("This is a workaround and should not be used");
}

答案 1 :(得分:1)

因为ArrayAdapter没有定义无参数构造函数。这是在没有参数的情况下调用super()时编译器查找的内容。它至少需要一个Context和一个资源(int)来初始化它自己。

答案 2 :(得分:1)

ArrayAdapter没有默认的iezero-param构造函数,因此您必须覆盖其中的一个构造函数。你可以在这里找到更多信息 android - There is no default constructor for ArrayAdapter

public class custom_row_adapter extends ArrayAdapter<Integer> { 
    public custom_row_adapter(Context context, int resource) {
        super(context, resource); 
    }

答案 3 :(得分:0)

由于您正在扩展 ArrayAdapter ,您可以从此处实例化您的对象:

Custom_row_adapter customAdapter = new Custom_row_adapter(this, android.R.layout.simple_spinner_item, insertIntegerArray);

如果您想在中添加一些额外的参数,请创建自定义构造函数

 public Custom_row_adapter(Context context, int resource, Integer[] array, arg extraArg) {
    super(context, resource, array);
    this.extraArg = extraArg;
 }

我的建议是将您的重命名为Custom_row_adapter。使用大写字符来启动类名称是一种很好的做法。

答案 4 :(得分:0)

来自JavaSE doc:

  

如果构造函数体不是以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用开始&#34; super();&# 34;,调用其直接超类的构造函数,不带参数。

为默认构造函数提供一个空构造函数体与放置超级调用即<。p>相同

public custom_row_adapter() {
    super();
}

相同
public custom_row_adapter() {}

因此,它会导致错误,因为超类中没有默认构造函数,并且需要显式构造函数调用。在这种情况下,您可以重载构造函数并使用 this(args)调用它,或使用 super(args)调用某个超类构造函数。

参考: http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.7

答案 5 :(得分:0)

我希望我理解你在问什么。

解决方案

因为ArrayAdapter没有默认的“no-arg”构造函数,所以必须提供一些参数。即而不是把

public custom_row_adapter() {
    super();
}

您需要指定(至少)两个参数。有关详细信息,请参阅Javadocs

public custom_row_adapter() {
    super(context, resource);
}

您需要确定contextresource的内容。由于您可能不需要此构造函数,因此它们可能是null而某些int可能是0-1

为什么

默认情况下,当没有为您的类提供构造函数时,Java会自动构建一个不执行任何操作的(基本上)。但是,只要您创建另一个构造函数,默认值(custom_row_adapter())“就会消失”。有关其他信息,请参阅this post

此外,默认情况下,no-arg构造函数(custom_row_adapter())的第一次调用是隐式super();(请参阅Java SE)。由于ArrayAdapter没有默认的无参构造函数,因此无效,您必须为其提供参数。