'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,例如List
、ArrayList
、Map
、HashMap
、Set
, HashSet
, 等等...
在我的 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,例如List
、ArrayList
、Map
、HashMap
、Set
, HashSet
, 等等...