【发布时间】:2015-04-23 11:03:05
【问题描述】:
我正在使用 Eclipse JDT Null 注释处理器,但在使用 java.lang.Class 时出现了一些奇怪的行为。
package test;
import org.eclipse.jdt.annotation.Nullable;
public class AnnotationSpul {
@Nullable
public <V> V get1(Class<V> type) {
return get2(type); //This line has a warning
}
@Nullable
public <V> V get2(Class<V> type) {
return null;
}
}
这是我的包裹信息:
@NonNullByDefault({ PARAMETER, RETURN_TYPE, FIELD })
package test;
import static org.eclipse.jdt.annotation.DefaultLocation.FIELD;
import static org.eclipse.jdt.annotation.DefaultLocation.PARAMETER;
import static org.eclipse.jdt.annotation.DefaultLocation.RETURN_TYPE;
import org.eclipse.jdt.annotation.NonNullByDefault;
我得到的警告是:“'@NonNull Class' 类型的表达式需要未经检查的转换才能符合'@NonNull Class'”
我不明白为什么会收到警告。方法签名完全一样,那为什么传递的值需要转换呢?为什么type 在一种方法中被推断为@NonNull Class<V> 而在另一种方法中被推断为@NonNull Class<@Nullable V>?
【问题讨论】:
-
我对这些注释不是很熟悉,但对我来说,您似乎声明了参数和返回值默认情况下为非 null(在包信息中)。然后你声明一个方法(以及返回类型)为nullable。这显然是矛盾的,不是吗? [我知道,这不涉及这两种方法之间的区别。]
-
我使用 Checker Framework 的 Nullness Checker 进行了尝试,它可以按您的意愿工作。 Nullness Checker 甚至可以识别 Eclipse 的注释。
-
作为风格问题,只要您使用的是 Java 8 编译器,最好在它修改的类型旁边写一个类型注释。例如,使用
public <V> @Nullable V get1(...)而不是@Nullable public <V> V get1(...)。 -
@DavidtenHove 是的,Checker Framework 的 Nullness Checker 不会发出警告。对于您的示例,它比 Eclipse JDT Null Analysis 更精确。
-
留给后代:这是 ecj 中的一个错误,从 4.5M5 开始修复。
标签: java eclipse null annotations