当前位置: 首页 > 面试题库 >

Java未经检查:varargs参数的未经检查的通用数组创建

马祺
2023-03-14
问题内容

我已将Netbeans设置为在我的Java代码中显示未经检查的警告,但是我无法理解以下几行的错误:

private List<String> cocNumbers;
private List<String> vatNumbers;
private List<String> ibans;
private List<String> banks;
...
List<List<String>> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans);

给出:

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]

方法来源:

/**
 * Returns a list of all possible combinations of the entered array of lists.
 *
 * Example: [["A", "B"], ["0", "1", "2"]]
 * Returns: [["A", "0"], ["A", "1"], ["A", "2"], ["B", "0"], ["B", "1"], ["B", "2"]]
 *
 * @param <T> The type parameter
 * @param elements An array of lists
 * @return All possible combinations of the entered lists
 */
public static <T> List<List<T>> createCombinations(List<T>... elements) {
    List<List<T>> returnLists = new ArrayList<>();

    int[] indices = new int[elements.length];
    for (int i = 0; i < indices.length; i++) {
        indices[i] = 0;
    }

    returnLists.add(generateCombination(indices, elements));
    while (returnLists.size() < countCombinations(elements)) {
        gotoNextIndex(indices, elements);
        returnLists.add(generateCombination(indices, elements));
    }

    return returnLists;
}

到底出了什么问题,我想如何解决呢?因为我认为在代码中留下未经检查的警告不是一个好主意?

忘了提,但我使用的是Java 7。

编辑 :我现在也看到该方法具有以下内容:

[unchecked] Possible heap pollution from parameterized vararg type List<T>
  where T is a type-variable:
    T extends Object declared in method <T>createCombinations(List<T>...)

问题答案:

如上面的janoh.janoh所述,Java中的varargs只是数组的语法糖,以及在调用站点处隐式创建数组。所以

List<List<String>> combinations =
    Utils.createCombinations(cocNumbers, vatNumbers, ibans);

实际上是

List<List<String>> combinations =
    Utils.createCombinations(new List<String>[]{cocNumbers, vatNumbers, ibans});

但是,您可能知道,new List<String>[]Java不允许这样做,原因是许多其他问题已经涵盖了这些原因,但主要与以下事实有关:数组在运行时知道其组件类型,并在运行时检查添加的元素是否与其组件匹配类型,但无法对参数化类型进行此检查。

无论如何,编译器仍然会创建数组,而不是失败。它执行以下操作:

List<List<String>> combinations =
    Utils.createCombinations((List<String>[])new List<?>[]{cocNumbers, vatNumbers, ibans});

这可能是不安全的,但不一定是不安全的。大多数varargs方法只是迭代varargs元素并读取它们。在这种情况下,它并不关心数组的运行时类型。您的方法就是这种情况。由于您使用的是Java
7,因此应将@SafeVarargs注释添加到方法中,并且不再收到此警告。这个注释基本上说,这种方法只关心元素的类型,而不关心数组的类型。

但是,有一些varargs方法确实使用了数组的运行时类型。在这种情况下,这可能是不安全的。这就是为什么出现警告的原因。



 类似资料:
  • IntelliJ Idea对我的测试用例中的一个语句发出以下警告。 警告:为varargs参数创建未经检查的泛型数组 编译器发出未经检查警告的位置 我所做的就是:

  • 问题内容: 如果我有泛型类,则不允许创建如下数组: (这将导致错误“无法创建Bar的通用数组”)。 但是,正如 dimo414 在回答该问题(Java如何:创建通用数组)中所建议的那样,我可以执行以下操作: (这将“仅”生成警告:“类型安全:未经检查从Object []到Bar []的转换”)。 在回应 dimo414 回答的评论中,有人声称使用此构造可能在某些情况下引起问题,而其他人则说这很好,

  • 问题内容: 我有以下代码行 哪里 但我收到有关未经检查的转化的警告。如何停止此警告? 问题答案: 之所以会这样,是因为getSpecialCharMap()返回的对象的类型不能由编译器验证为HashMap 。继续并提供getSpecialCharMap的原型。

  • 问题内容: 我正在使用反射来构造一个将File作为参数的类(ConfigBuilder): 但是我得到这个警告: 显然,似乎getConstructor期望使用泛型,因此我尝试了类似的操作: 但我收到相同的警告消息 任何想法 ? 大卫 问题答案: 该警告实际上是指。您还需要参数化它(和)。

  • 我有一个基本的rest控制器,可以获取参数。 如果查询字符串包含我没有定义的参数,我如何拒绝连接? 当前,在调用此url时,只使用id执行该方法,而忽略未知的参数。一般来说,这很好,但我如何验证它们,以防返回HTTP状态码?

  • 问题内容: 我一直在阅读有关未解决问题和已解决问题的信息,没有一个在线资源真正了解它们之间的区别以及何时使用两者。 据我了解,它们都在运行时抛出,它们都表示超出逻辑预期范围的程序状态,但是必须显式捕获已检查的异常,而未检查的异常则不能。 我的问题是,假设出于参数考虑,我有一个将两个数字相除的方法 以及需要在某处划分的方法 谁负责检查分母为零的情况,应该检查还是取消检查异常(忽略Java的内置div