Android непроверенное назначение - PullRequest
0 голосов
/ 11 марта 2019

Я использую службы определения местоположения в своем приложении, и там, где я устанавливаю разрешения, у меня появляется следующее предупреждение: Непроверенное назначение: 'java.util.ArrayList' to 'java.util.ArrayList

Код:

permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    permissionsToRequest = findUnAskedPermissions(permissions);

Предупреждение появляется в последней строке.

Я определил массивы следующим образом при запуске кода:

 ArrayList<String> permissions = new ArrayList<>();
ArrayList<String> permissionsToRequest= new ArrayList<>();
ArrayList<String> permissionsRejected = new ArrayList<>();

Также позже в моем коде, где я спрашиваю разрешение (если не разрешено пользователем):

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (permissionsToRequest.size() > 0) {
                requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
                        ALL_PERMISSIONS_RESULT);
                canGetLocation = false;
            }
        }

здесь toArray вызывает предупреждение: Вызов toArray () саргумент предварительно заданного размера массива 'new String [permissionsToRequest.size ()]

Здесь я могу попытаться заменить его на

toArray(new String[0])

, но не уверен, правильно ли это.

1 Ответ

1 голос
/ 11 марта 2019

Для предупреждения Unchecked assignment: 'java.util.ArrayList' to 'java.util.ArrayList я предполагаю, что возвращаемое значение метода findUnAskedPermissions равно ArrayList, а не ArrayList<String> (как и должно быть).

Что касается создания массива, в подсказке проверки IDEA есть объяснение, почему toArray(new String[0]) предпочтительнее:

Существует два стиля для преобразования коллекции в массив: либо с использованием массив предварительно заданного размера (например, c.toArray (new String [c.size ()]) ) или используя пустой массив (например, c.toArray (new String [0]) .

В старых версиях Java было рекомендовано использовать массив предопределенного размера, так как вызов отражения, который необходим для создания массива правильного размера было довольно медленно Однако после поздних обновлений OpenJDK 6 этот вызов был что делает производительность пустой версии массива такой же, а иногда даже лучше, по сравнению с версией предварительного размера. Также передача предварительно заданного размера опасна для одновременного или Синхронный сбор как гонка данных возможна между size и toArray вызов, который может привести к дополнительным нулям в конец массива, если коллекция была одновременно сокращена во время операция.

Существует углубленный анализ различных способов создания массивов, которые пришли к такому выводу:

toArray (новый T [0]) кажется быстрее, безопаснее и чище по контракту, и поэтому сейчас должен быть выбран по умолчанию. Будущие оптимизации VM может закрыть этот разрыв производительности для toArray (новый T [размер]), рендеринг текущее "считается оптимальным" использование наравне с фактически оптимальный. Дальнейшие улучшения API toArray будут следовать та же логика, что и toArray (new T [0]) - сама коллекция должна создать соответствующее хранилище.

...