Кафка испорченное сообщение

Как упоминалось выше janoh.janoh, varargs в Java - это просто синтаксический сахар для массивов плюс неявное создание массива на вызывающем сайте. Таким образом,

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, которые используют тип среды выполнения массива. В этом случае это потенциально опасно. Вот почему предупреждение есть.

0
задан cricket_007 21 February 2019 в 21:15
поделиться