2015-04-23 123 views
3

我正在使用Eclipse JDT空注释处理器,并且在使用java.lang.Class时出现了一些奇怪的行为。Eclipse中的空注释处理器

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类的需求选中转换的表达,以符合“@NonNull类< @Nullable V >''

我不明白为什么我会收到警告。方法签名完全相同,为什么传递的值需要转换?为什么type在一种方法中推断为@NonNull Class<V>而在另一种方法中推断为@NonNull Class<@Nullable V>

+0

我对这些注释并不是很熟悉,但对我来说,它看起来像声明了default_(在包信息中)有参数和返回值_non null。之后,您将一个方法(以及返回类型)声明为_nullable_。这显然是相互矛盾的,不是吗? [我知道,这并不涉及这两种方法之间的区别。] – Seelenvirtuose

+1

我尝试使用Checker框架的[Nullness Checker](http://types.cs.washington.edu/checker-framework/current/checker -framework-manual.html#nullness-checker),并按照你的愿望工作。 Nullness Checker甚至可以识别Eclipse的注释。 – mernst

+0

就风格而言,只要您使用Java 8编译器,最好在它修改的类型旁边编写类型注释。例如,使用'public @Nullable V get1(...)'而不是'@Nullable public V get1(...)'。 – mernst

回答

2

这是一个bug in ecj 4.4。在类型推断和null推理ecj的组合中,过度渴望地将类型参数推断为@Nullable V

该错误已修复为4.5M5,所以即将推出的release 4.5 (Mars)将按预期接受程序。