【问题标题】:How to resolve compiler warning如何解决编译器警告
【发布时间】:2020-05-23 11:19:33
【问题描述】:

我有这个编译器警告:在上述代码中使用未经检查或不安全的操作

new InsertAllTask(essenceDao).execute(essenceList)

但我不知道为什么,我尝试使用 -Xlint 参数运行,没有更多信息。

代码有效,但警告仍然存在。

希望你能帮忙

整个任务:

public static class DeleteAllTask extends AsyncTask<Void, Void, Void> {
    private final EssenceDao essenceDao;
    private final List<Essence> essenceList;

    DeleteAllTask(EssenceDao essenceDao, List<Essence> list) {
        this.essenceDao = essenceDao;
        this.essenceList = list;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        essenceDao.deleteAllEssence();
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (essenceList != null) {
            // Insert new list
            new InsertAllTask(essenceDao).execute(essenceList);
        }
    }
}

插入任务:

public static class InsertAllTask extends AsyncTask<List<Essence>, Void, Void> {
    private final EssenceDao essenceDao;

    InsertAllTask(EssenceDao essenceDao) {
        this.essenceDao = essenceDao;
    }

    @Override
    @SafeVarargs
    protected final Void doInBackground(List<Essence>... essences) {
        essenceDao.insertEssence(essences[0]);
        return null;
    }
}

【问题讨论】:

  • InsertAllTask是通用的吗?
  • 也许它是题外话,但你能澄清一下 - 使用 AsyncTask 是你的强项(你必须保持遗留,你没有时间重构和类似的东西)或者你对其他方法持开放态度切换执行到后台,但只是不知道它们是什么?
  • 您已将doInBackground 标记为@SafeVarargs,但您正在调用继承的execute 方法,该方法显然没有注释。
  • 我不明白你的回答。我不建议删除现有的注释。我说继承的execute方法没有。由于该方法不在您的职责范围内并且不能被覆盖,因此您无能为力。由于this page 说,整个类已弃用,Android 开发人员可能更不可能修复此问题。
  • 会有一种可能的解决方法。您可以实现 AsyncTask&lt;Essence, Void, Void&gt; 并使用所有参数,而不是实现 AsyncTask&lt;List&lt;Essence&gt;, Void, Void&gt; 并仅使用 varargs 方法的第一个参数,例如doInBackground(Essence... essences) { essenceDao.insertEssence(Arrays.asList(essences)); return null; }。但是,调用者还需要传递一个数组,即new InsertAllTask(essenceDao) .execute(essenceList.toArray(new Essence[0]));

标签: java android android-room


【解决方案1】:

由于您试图在不修复警告源的情况下抑制警告(-Xlint),因此您可以将此注释添加到包含不安全代码的方法中:

    @SuppressWarnings({"unused", "rawtypes"})

示例

以上代码:

    public class TestUnsafe {
      public static void main(String[] args) {
        List myList = new ArrayList();
      }
    }

当我尝试编译时显示这些警告:

javac TestUnsafe.java -Xlint

    TestUnsafe.java:7: warning: [rawtypes] found raw type: List
        List myList = new ArrayList();
        ^
      missing type arguments for generic class List<E>
      where E is a type-variable:
        E extends Object declared in interface List
    TestUnsafe.java:7: warning: [rawtypes] found raw type: ArrayList
        List myList = new ArrayList();
                          ^
      missing type arguments for generic class ArrayList<E>
      where E is a type-variable:
        E extends Object declared in class ArrayList
    2 warnings

但是,使用几个注释:

    public class TestUnsafe {
      @SuppressWarnings({"unused", "rawtypes"})
      public static void main(String[] args) {
        List myList = new ArrayList();
      }
    }

javac TestUnsafe.java -Xlint 返回一个空的编译日志。

与我们分享一个可重现的最小示例,以找到正确的注释或修复它!

【讨论】:

  • 我不想通过静音来抑制警告。我想修复我的代码。但感谢感谢,帮助
  • 请您在 github 存储库中复制您的警告以消除此警告:D 吗?
猜你喜欢
  • 2012-10-01
  • 2020-02-16
  • 2011-04-09
  • 2020-11-25
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多