В книге Effective Java в пункте 42 говорится о методе varargs.
В нем говорится:
ReturnType1 suspect1(Object... args){}
<T> ReturnType2 suspect2(T... args){}
Методы с любой из этих сигнатур будутпринять любой список параметров. Любая проверка типов во время компиляции, которая была у вас до модернизации, будет потеряна.
Я запутался.
Вопрос первый: Почему модернизация / рефакторингметод к varargs может потерять проверку типов раньше в методе? В приведенных выше двух признаках метода, не является ли Object
и T
тип, указанный там? Каким образом мы могли бы точно потерять проверку типов? В книге объясняется, что, ссылаясь на пример, созданный автором, но я не понимаю:
======= пример, используемый автором для убеждения читателей =======
автор сделал пример Arrays.asList(...)
, что до Java 1.5 , следующий код вызовет ошибку времени компиляции для проверки типа:
int[] digits = {3,1,4}
// Compiler error: asList(Object[]) in Arrays can't be applied to (int[])
System.out.println(Arrays.asList(digits));
и с java1.5 и выше , из-за введения varargs
приведенный выше код подходит для компилятора. Arrays.asList(digits)
объединяет все int[]
в один объект, так что Arrays.asList(digits)
возвращает одноэлементный массив массивов List<int[]>
.
Вопрос второй: Я понимаю этот пример, это действительно пример потери проверки типов, но действие оборачивания примитивного массива int (digits
) в объект выполняетсяМетод Arrays.asList()
, а не использование vargars
(или я здесь не прав?), Почему автор использует этот пример, чтобы сказать, что все методы с этими двумя сигнатурами могут потерять проверку типов во время компиляции? как? Какие-нибудь примеры, чтобы убедить меня?