我想将一个实用程序方法引入Java 8.名为max的方法定义如下:

@SafeVarargs
public static final <E extends Comparable<E>> E max(final E... elements) {
    E result = null; // error
    for(final E e : elements) {
        if(result == null || result.compareTo(e) < 0) {
            result = e;
        }
    }
    return result;
}

现在Eclipse显示错误:

空类型不匹配(类型注释): null与自由类型变量E不兼容。

@Nullable以为将@Nullable添加到result的定义应该删除错误,但显然不是这种情况。 即使我另外使用@Nullable注释整个方法,错误仍然存​​在。

顺便说一句,我正在使用FindBugs的jsr-305.jar,并已配置Eclipse以尊重javax.annotation.Nonnull以及javax.annotation.Nullable 编辑:我在Lubuntu上运行Eclipse Luna 4.4.2和Oracle JDK 8 build 1.8.0_25-b17。

现在我的问题是:错误来自哪里? 如何在保持注释和泛型类型定义的好处的同时摆脱它?

编辑:我刚刚添加了一个示例项目,其中使用了默认的eclipse注释,它似乎有些工作(除了在result == null处生成警告,因为它错误地推断结果在该点只能为null)。 所以这似乎是一个带有非默认注释类的Eclipse问题。 我用我自己的Eclipse的Nullable注释副本重新测试它,并得到与上面相同的错误。

#1楼 票数:2 已采纳

错误来自哪里?

我在文档中找到了这个:

对应于无约束类型参数的类型变量需要悲观检查以确保所有合法替换的安全性:此类型既不能被认为是可空的也不是非空的。

 class C<T extends Number> { int consume(T t) { return t.intValue(); // NOT OK since T could be nullable } T provide() { return null; // NOT OK since T could require nonnull } } 

最后一点可能看起来令人惊讶,但请注意,无约束类型参数意味着我们可能不会假设任何关于由相应类型变量表示的类型的null。 更重要的是:我们必须积极支持可空和非空类型。 另一方面,这只是扩展了现有规则,即与无界类型变量兼容的唯一类型是类型变量本身。 要在null分析的上下文中解释这种情况,编译器将针对provide()中的返回引发以下错误:

在实例化泛型类型或调用泛型方法时,必须遵守type参数提出的约束。

如何在保持注释和泛型类型定义的好处的同时摆脱它?

将@Nullable添加到<E extends Comparable<E>> ,就像这样

@SafeVarargs
public static final  <@Nullable E extends Comparable<E>> E max(final E... elements) {
    E result = null; // no error
    for(final E e : elements) {
        if(result == null || result.compareTo(e) < 0) {
            result = e;
        }
    }
    return result;
}

#2楼 票数:1

Tja,可选。 如果varargs数组为空,怎么回事?

public static final <E extends Comparable<E>> Optional<E> max(final E... elements) {
    Optional<E> result = Optional.empty();
    for(final E e : elements) {
        if(!result.isPresent() || result.get().compareTo(e) < 0) {
            result.set(e);
        }
    }
    return result;
}

或者至少需要一个参数。

public static final <E extends Comparable<E>> E max(final E first, final E... elements) {
    E result = first;
    for (final E e : elements) {
        if (/*result != null ||*/ result.compareTo(e) < 0) {
            result = e;
        }
    }
    return result;
}

  ask by llogiq translate from so

未解决问题?本站智能推荐:

1回复

在Eclipse中自动生成知道@NonNull注释的equals和hashCode

有没有办法配置Eclipse自动生成hashCode并equals于@NonNull注释的意识? 目前,我的Eclipse生成带有不必要的null检查的代码,即使在标记为@NonNull字段上也是@NonNull 。 请注意,FindBugs将引发警告, 这些空检查是多余的 。 当然
1回复

由StringUtils.isNotBlank检查的NPE仍会导致eclipse @NotNull警告

我正在使用@NotNull注释,你可以看到我正在使用: StringUtils.isNotBlank() 检查NP,但我仍然有Eclipse警告。 如果我使用 oldlink!= null 它不会显示警告。 有没有人知道使用apache commons
4回复

是否有一个很好的Eclipse插件来检查@Nonnull和@Nullable注释?

在Eclipse中检查@Nonnull和@Nullable注释是一个早期测试版 。 最大的问题是它不知道Java API的null行为。 还有其他目前更好的插件吗?
1回复

在eclipse中使用jsr305注释的Findbugs没有发现错误

我一直在尝试使用jsr 305注释与Findbugs一起使用,特别是@CheckForNull注释,它可以避免我刚刚发现给客户的错误。 我已将jsr305.jar和annotations.jar添加到我的构建路径中,但findbugs找不到错误。 我正在使用Eclipse和Eclipse F
4回复

@Nullable / @NotNull与IntelliJ IDEA,Maven和JSR 305

我非常喜欢代码检查功能,现在可以使用JSR 305或Jetbrains的IntelliJ专有注释。 不幸的是,这两种实现(JSR 305和Jetbrains')混合不好: IntelliJ显然只能理解它自己的一套注释并将它们很好地集成在一起。 在我的Maven Build中使
3回复

无法理解此Java Stream + Generics示例

有人可以帮助我理解为什么这段代码的行为如评论中所述 它显然与泛型方法中的类型定义有关,它是必须以某种方式提供的信息......但为什么它是强制性的? 在语法上,我应该从of()和collect()方法的签名中找出它吗?
2回复

Java泛型ECLIPSE错误?

这是一个错误还是什么? 我正在使用Eclipse,我一直收到这个警告。 这有什么不对......
8回复

使用Java HashMap进行Eclipse警告

当我使用以下代码时,Eclipse会说“HashMap是原始类型” 知道什么可能是错的吗?