Android未选中的分配

时间:2019-03-11 18:10:14

标签: android arraylist permissions android-permissions toarray

我在我的应用程序中使用位置服务,并且在设置权限的位置出现以下警告:未检查的分配:从'java.util.ArrayList'到'java.util.ArrayList < / p>

代码:

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会引发警告:使用预先设置大小的数组参数'new String [permissionsToRequest.size()]调用'toArray()'

在这里我可以尝试将其替换为

toArray(new String[0])

但不确定是否正确。

1 个答案:

答案 0 :(得分:1)

对于Unchecked assignment: 'java.util.ArrayList' to 'java.util.ArrayList警告,我假设findUnAskedPermissions方法的返回值只是ArrayList而不是ArrayList<String>(应该是)。

关于数组的创建,inspection hint of IDEA中有一个解释为什么偏爱toArray(new String[0])的解释:

  

有两种样式可以将集合转换为数组:   预定大小的数组(例如 c.toArray(new String [c.size()]))或   使用空数组(例如 c.toArray(new String [0])

     

在较早的Java版本中,建议使用预大小数组,因为   创建适当大小的数组所必需的反射调用   很慢但是,由于OpenJDK 6的更新较晚,因此此调用是   内在的,使空数组版本的性能   与预先确定的版本相比,有时甚至更好。   同样,传递预大小的数组对于并发或   同步收集,因为    size toArray 调用可能会导致在   数组的末尾(如果集合在执行期间同时缩小)   操作。

得出结论的in-depth analysis种不同的创建数组的方式:

  

toArray(new T [0])看起来更快,更安全且从合约上讲更干净,并且   因此现在应该是默认选择。未来的VM优化   可能会缩小toArray(new T [size])的性能差距,从而导致   当前“被认为是最佳”用法与实际   最佳之一。 toArray API的进一步改进将遵循   与toArray(new T [0])的逻辑相同-集合本身应创建   适当的存储空间。