【问题标题】:'Unchecked call' on ArrayList [duplicate]ArrayList上的“未经检查的调用”[重复]
【发布时间】:2018-08-26 20:43:29
【问题描述】:

在我的 MainActivity 文件中的以下代码中,我不明白为什么会出现此错误以及如何解决这些错误。我在谷歌上搜索过,但我无法将解决方案与我的代码联系起来。我也将 -Xlint:unchecked 传递给 javac,但也没有更明智的方法。

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

提前致谢。

未经检查的分配:'java.util.ArrayList' 'java.util.ArrayList' 少... (Ctrl+F1) 信号 编译器发出未经检查的警告的地方,例如 示例:

void f(HashMap 映射) { map.put("key", "value");提示:将 -Xlint:unchecked 传递给 javac 以获取更多详细信息。


未经检查地调用 'ArrayList(Collection)' 作为 raw type 'java.util.ArrayList' less... (Ctrl+F1) 信号位置 编译器发出未经检查的警告,例如:

void f(HashMap 映射) { map.put("key", "value");提示:将 -Xlint:unchecked 传递给 javac 以获取更多详细信息。


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<>();
    }
}

【问题讨论】:

  • 什么是items
  • 如果您将编译器消息作为代码而不是引号发布,类型参数也会显示(例如java.util.ArrayList&lt;java.util.String&gt;

标签: java android unchecked


【解决方案1】:

问题是由于错误地使用了generic。您通常应该将泛型与 ArrayList 一起使用来指定要存储在 ArrayList 中的对象的类型。

像这样:

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

请检查您的代码中items 的定义。

【讨论】:

    【解决方案2】:

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

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

     // 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);
    

    解决方案:为尖括号&lt;&gt;内的泛型类型指定或传递特定类型。

     // 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中内置了很多泛型类如ListArrayListMapHashMapSetHashSet等...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多