我在我的应用程序中使用位置服务,并且在设置权限的位置出现以下警告:未检查的分配:从'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])
但不确定是否正确。
答案 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])的逻辑相同-集合本身应创建 适当的存储空间。