【问题标题】:How to add a default contructor如何添加默认构造函数
【发布时间】:2016-07-15 06:39:51
【问题描述】:

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

这是我的代码的 sn-p:

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() 的构造函数

所以我在谷歌上找到了几篇帖子,其中一篇告诉我可以通过在“检查”选项卡中搜索 Instantiable 并将其设置为 WARNING 来解决该错误来绕过该错误。没用。

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

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

编辑2:这里还有一些图片,注意左下角的错误:

什么在调试中起作用:

Paul G 的回答:

默认构造函数:

没有构造函数:

【问题讨论】:

  • 如果你需要一个默认的构造函数只是为了它,你可以将它作为public custom_row_adapter() { }
  • 您是说它构建得很好,但是只有在生成签名的 APK 时才会出现错误?对我来说听起来很可疑。
  • 如果我构建>构建 apk 它会生成没有错误的调试 apk,但是当我尝试生成签名 apk 时,会发生错误。

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


【解决方案1】:

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

你可以尝试让 Android Studio 清醒过来,例如更新构建工具、清理工作区、删除build 目录……如果不起作用,你可以添加请求的(没用的)默认构造函数:

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

【讨论】:

  • 谢谢!我缺少的是使用null, 0 作为超级参数
【解决方案2】:

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

【讨论】:

  • 我对 Java 有点陌生,但明白你在说什么,但我不知道如何解决它。能否以代码形式给出解决方案?
  • 只需在无参数构造函数中删除对 super() 的调用
【解决方案3】:

ArrayAdapter 没有默认构造函数,即零参数构造函数,因此您必须覆盖它所具有的构造函数之一。你可以在这里找到更多信息 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); 
    }

【讨论】:

  • 好的,谢谢你的链接。看完后得出的结论是,我需要手动将 ArrayAdapter 指向一个超类的构造函数。我将如何实现这一目标?您说“覆盖它确实具有的其中一个”您所说的其中一个到底是什么意思? (如果很明显,请原谅我,我似乎无法理解整个事情)
  • 后编辑:感谢您添加这些代码行。但是在尝试了这些代码行之后,我仍然得到没有默认构造函数的错误。我想没有参数意味着绝对为零。
  • @Pythogen 你摆脱了零参数构造函数吧?还要确保你的类中没有任何其他构造函数在第一行没有调用 super
  • 是的,有 2 个构造函数,你告诉我使用的默认构造函数和我的自定义构造函数,第一行有 super。
【解决方案4】:

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

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

如果你想在你的中添加一些额外的参数,那么创建一个自定义的constructor

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

我的建议是将您的 class 重命名为 Custom_row_adapter。以 Upper Case 字符开头的类名是一个好习惯。

【讨论】:

  • 从这里你是指我的custom_row_adapter.java吗?那么我在哪里放置我的默认构造函数呢? (好吧,不是在哪里,而是我如何在不需要参数的情况下做到这一点)您能否发布更多信息,并可能包含您提供的第一个代码示例中的构造函数?
  • @Pythogen 不,我的意思是从您的上下文,可能是ActivityService
  • @Pythogen 因为这个类扩展了一个 ArrayAdapter 你不需要在其中放置一个构造函数。
  • 您是说我应该将 custom_row_adapter 复制并粘贴到包含阵列适配器的文件中吗? (对不起,如果这根本不是你所说的)调用 custom_row_adapter 的文件中有这个: ListAdapter picAdapt = new custom_row_adapter(this, picList, url, fullUrl);然后 custom_row_adapter 类在一个新的 Java 文件中,如果我完全删除构造函数,我会收到没有默认构造函数的消息。
  • 很高兴知道这些参数的类型。无论如何,这可能是因为 ArrayAdapter 类中没有具有该类型/参数数量的构造函数。
【解决方案5】:

来自 JavaSE 文档:

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

为默认构造函数提供一个空的构造函数主体与进行超级调用相同,即

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

【讨论】:

    【解决方案6】:

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

    解决方案

    因为ArrayAdapter 没有默认的“无参数”构造函数,所以您必须提供一些参数。 IE。而不是放

    public custom_row_adapter() {
        super();
    }
    

    您需要指定(至少)两个参数。请参阅Javadocs 了解更多信息。

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

    contextresource 是什么需要你自己确定。由于您可能不需要此构造函数,它们可能是null 和一些int,例如0-1

    为什么

    默认情况下,当没有为您的类提供构造函数时,Java 会自动为您构建一个(基本上)什么都不做的构造函数。但是,一旦您创建另一个构造函数,默认的 (custom_row_adapter()) 就会“消失”。请参阅this post 了解更多信息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2023-03-20
      • 2010-10-30
      • 2014-05-15
      • 2011-03-12
      • 2018-04-23
      相关资源
      最近更新 更多