【问题标题】:Null annotation processor in EclipseEclipse 中的空注释处理器
【发布时间】: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&lt;V&gt; 而在另一种方法中被推断为@NonNull Class&lt;@Nullable V&gt;

【问题讨论】:

  • 我对这些注释不是很熟悉,但对我来说,您似乎声明了参数和返回值默认情况下为非 null(在包信息中)。然后你声明一个方法(以及返回类型)为nullable。这显然是矛盾的,不是吗? [我知道,这不涉及这两种方法之间的区别。]
  • 我使用 Checker Framework 的 Nullness Checker 进行了尝试,它可以按您的意愿工作。 Nullness Checker 甚至可以识别 Eclipse 的注释。
  • 作为风格问题,只要您使用的是 Java 8 编译器,最好在它修改的类型旁边写一个类型注释。例如,使用public &lt;V&gt; @Nullable V get1(...) 而不是@Nullable public &lt;V&gt; V get1(...)
  • @DavidtenHove 是的,Checker Framework 的 Nullness Checker 不会发出警告。对于您的示例,它比 Eclipse JDT Null Analysis 更精确。
  • 留给后代:这是 ecj 中的一个错误,从 4.5M5 开始修复。

标签: java eclipse null annotations


【解决方案1】:

这是bug in ecj 4.4。在类型推断和空推断的组合中,ecj 过度急切地将类型参数推断为 @Nullable V

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

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多