Java Eclipse中的空注释处理器

Java Eclipse中的空注释处理器,java,eclipse,null,annotations,Java,Eclipse,Null,Annotations,我使用的是EclipseJDTnull注释处理器,在使用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 lin

我使用的是EclipseJDTnull注释处理器,在使用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;
    }
}
我得到的警告是:“类型为'@NonNull Class'的表达式需要未经检查的转换才能符合'@NonNull Class'”

我不明白为什么我会得到警告。方法签名完全相同,那么为什么传递的值需要转换呢?为什么在一种方法中,
type
被推断为
@NonNull Class
,而在另一种方法中,
@NonNull Class
被推断为
这是一个错误。在类型推断和空推断的组合中,ecj急切地将类型参数推断为
@Nullable V


该错误已在中修复,因此即将发布的程序将按预期接受该程序。

我对这些注释不是很熟悉,但对我来说,您似乎声明默认情况下参数和返回值为非空(在包信息中)。之后,将方法(以及返回类型)声明为可空。这显然是矛盾的,不是吗?[我知道,这并没有处理这两种方法之间的差异。]我使用Checker框架尝试了这一点,它按照您的意愿工作。空值检查器甚至可以识别Eclipse的注释。就风格而言,只要您使用Java 8编译器,最好在它修改的类型旁边写一个类型注释。例如,使用
public@Nullable V get1(…)
而不是
@Nullable public V get1(…)
@DavidtenHove是,检查器框架的空度检查器不会发出警告。例如,它比EclipseJDTnull分析更精确。对于后代来说:这是ecj中的一个bug,在4.5M5时得到了修复。
@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;