gpt4 book ai didi

java - 基于注解的空值分析——警告只出现在数组参数中

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:09 25 4
gpt4 key购买 nike

在涉及数组的情况下使用基于注释的空值分析时,我收到以下(令人困惑的)警告:

Null type safety (type annotations): The expression of type 'int[]' needs unchecked conversion to conform to 'int @Nullable[]'

当我将未注释的 int[] 传递给 int @Nullable[] 参数时会发生这种情况。

这令人惊讶。通常情况下,如果您采用可为空的值并尝试将其传递给非空参数,这只是一个问题,但我正在做相反的事情 - 采用已知的非空(尽管未注释)数组并将其传递给方法(Arrays.equals) 接受空值。

此外,对于非数组对象似乎也不是问题。通常,一个变量或(未注释的、非数组的)T 类型的返回值可以分配给一个@Nullable T

所以我的问题是T 是数组类型 时为什么会发生变化?


我的类是使用 int[](取自 C++ 函数)作为唯一标识符的 native 类的可散列/相等性可比较代理。我的包使用基于注释的空值分析,而第 3 方包(带有 native 类)没有。

这是显示问题的简化版本:

TagKey.java:

package example;

import java.util.Arrays;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

import other.Tag;

import com.google.common.collect.Interner;
import com.google.common.collect.Interners;

public class TagKey {

private TagKey(Tag tag) {
this.tag = tag;
}

public static TagKey forTag(Tag tag) {
TagKey candidateKey = new TagKey(tag);
return INTERNER.intern(candidateKey);
}

@Override
public int hashCode() {
return Arrays.hashCode(this.tag.getUniqueIdentifier());
}

@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
} else if (obj == null) {
return false;
} else if (getClass() != obj.getClass()) {
return false;
} else {
return ((TagKey) obj).hasMatchingIdentifier(this.tag.getUniqueIdentifier()); // Warning appears here
}
}

public boolean hasMatchingIdentifier(int @Nullable[] id) {
return Arrays.equals(this.tag.getUniqueIdentifier(), id);
}

@SuppressWarnings("null") // Guava cannot use type parameter annotations due to backward compatibility with Java 6
private static final Interner<TagKey> INTERNER = Interners.newWeakInterner();

private final Tag tag;

}

package-info.java:

/**
* @author finnw
*
*/
@org.eclipse.jdt.annotation.NonNullByDefault
package example;

Tag.java:(部分)

package other;

public class Tag {
public native int[] getUniqueIdentifier(); // Currently returns a fresh array on each call, but may change in the near future to reuse a single array
}

我目前使用的解决方法:

    public boolean hasMatchingIdentifier(@Nullable Object id) {
return id instanceof int[] &&
Arrays.equals(this.tag.getUniqueIdentifier(), (int[])id);
}

我宁愿避免这些方法:

  • @SuppressWarnings("null") 添加到TagKey 或其equals 方法(生产版本稍微复杂一些,具有较高的使 NPE 尴尬的风险。)

注意事项:

  • 我的 JDT 版本是 3.10.0.v20140606-1215
  • 之前我错误地声明了@Nullable int[] id。令人惊讶的是,没有警告消息,尽管它暗示原始 int 元素可能是 null,这显然是错误的。

最佳答案

添加这个方法:

@SuppressWarnings("null")
public static int @Nullable[] getUniqueIdentifier(Tag tag) {
return tag.getUniqueIdentifier();
}

然后:

return ((TagKey) obj).hasMatchingIdentifier(getUniqueIdentifier(this.tag));

这就是为什么在支持无效配置文件之前我会忽略“未检查的非注释转换”警告,你要么在所有地方抑制空警告(这违背了要点),要么为每个库制作带注释的包装器方法。

关于java - 基于注解的空值分析——警告只出现在数组参数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com