'Unchecked call' 在 ArrayList 上

'Unchecked call' on ArrayList

在我的 MainActivity 文件中的以下代码中,我不明白为什么会出现此错误以及如何解决这些错误。我在 Google 上搜索过,但无法将解决方案与我的代码相关联。我也已将 -Xlint:unchecked 传递给 javac,但也不能变得更聪明。

我对 Android 和 Java 编程还很陌生,并试图解决我的代码中的任何亮点。

提前致谢。

Unchecked assignment: 'java.util.ArrayList' to 'java.util.ArrayList' less... (Ctrl+F1) Signals places where an unchecked warning is issued by the compiler, for example:

void f(HashMap map) { map.put("key", "value"); } Hint: Pass -Xlint:unchecked to javac to get more details.


Unchecked call to 'ArrayList(Collection)' as a member of raw type 'java.util.ArrayList' less... (Ctrl+F1) Signals places where an unchecked warning is issued by the compiler, for example:

void f(HashMap map) { map.put("key", "value"); } Hint: Pass -Xlint:unchecked to javac to get more details.


private void readItems() {
    File filesDir = getFilesDir();
    File todoFile = new File(filesDir, "todo.txt");
    try {
        items = new ArrayList<>(FileUtils.readLines(todoFile));
    } catch (IOException e) {
        items = new ArrayList<>();
    }
}

问题的发生是因为不正确地使用了generic。您通常应该将泛型与 ArrayList 一起使用来指定要存储在 ArrayList 中的对象类型。

像这样:

ArrayList<String> list = new ArrayList<>();

请检查代码中 items 的定义。

根本原因: 您正在使用 ArrayList 作为 Java 中的泛型类型,但没有为其指定特定类型。这就是编译器显示该警告的原因。

那么当您没有为泛型指定特定类型时会发生什么。这是一个场景。

 // You want this line contains only Integer.
List list = new ArrayList<>();

// 1. Warning when add new item.
list.add(1);
list.add(2);
list.add(3);

// 2. Must cast to Integer when using.
Integer number2 = (Integer) list.get(1);

// 3. Do not prevent developers from adding non-integer type, such as String, double, boolean etc.
list.add("Four");
list.add(true);

// 4. Might throws ClassCastException and make your app crashes.
Integer number = (Integer) list.get(4);

解决方法: 指定或为尖括号内的通用类型传递特定类型 <>.

 // You want this line contains only Integer.
List<Integer> list = new ArrayList<>();

// If you want to declare variable first
List<Integer> items;

// Then initialize
items = new ArrayList<>();

// 1. No warning when add new item.
items.add(1);
list.add(2);
list.add(3);

// 2. No need to cast to Integer.
Integer number2 = list.get(1);

// 3. Prevent developers from adding non-integer type, such as String, double, boolean etc.
list.add("Four"); // Error when compile
list.add(true); // Error when compile

// 4. You cannot add non-integer type and no need to cast so ClassCastException never occurs.
Integer number = list.get(2);

Java中内置了许多泛型class,例如ListArrayListMapHashMapSet, HashSet, 等等...