我已将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