如何利用泛型并在addItem的这种用法中检查我的参数?

时间:2018-01-23 20:01:49

标签: java generics

所以,我得到了好的' JComboBox的unchecked call to addItem(E)。我熟悉常见的情况,但组合框在功能上处理的列表中,解决方案使我无法理解。剥离代码示例:

public static Boolean final test(final List<JComboBox> comboboxList) {
  final List<String> stuff=new ArrayList<>();
  // stuff gets stuffed with stuff here
  comboboxList.forEach((JComboBox combobox) -> {
    combobox.removeAllItems();
    stuff.forEach((contents) -> {
      combobox.addItem(contents);
    });
  });
}

传入List中的组合框都声明为<String>,但这似乎并没有帮助forEach中的addItem。好像我应该在forEach中声明它,但我一直无法找到这样做的有效语法。

1 个答案:

答案 0 :(得分:1)

  

传入List中的组合框都声明为   ,但这似乎并没有帮助forEach中的addItem。

它没有帮助,因为您在每次使用String类声明变量时都没有指定JComboBox类型。
所以它声明原始JComboBox,即JComboBox<Object> 而警告。

public static Boolean test(final List<JComboBox<String>> comboboxList) {
    final List<String> stuff = new ArrayList<>();
    // stuff gets stuffed with stuff here
    comboboxList.forEach((JComboBox<String> combobox) -> {
        combobox.removeAllItems();
        stuff.forEach((contents) -> {
            combobox.addItem(contents);
        });
    });

   return someBooleanValue; // to compile
}

请注意,声明lambda参数的类型不是必需的。您可以通过以下方式快捷编写代码:

public static Boolean test(final List<JComboBox<String>> comboboxList) {
    final List<String> stuff = new ArrayList<>();
    // stuff gets stuffed with stuff here
    comboboxList.forEach(combobox -> {
        combobox.removeAllItems();
        stuff.forEach(combobox::addItem);
    });

   return someBooleanValue; // to compile
}