为什么java.util.Optional.ofNullable()期望@NonNullable?

为什么java.util.Optional.ofNullable()期望@NonNullable?,java,annotations,nullable,eclipse-jdt,type-mismatch,Java,Annotations,Nullable,Eclipse Jdt,Type Mismatch,我想弄清楚,为什么一个只用于包装null的实用程序类需要@NonNullable参数。下面的示例在Eclipse中产生了意外的(对我来说)null类型不匹配错误 Null类型不匹配(类型批注):必需“@NonNull IoSession” 但此表达式的类型为“@Nullable IoSession” 我本来不会这样写代码的,但我被困在我试图为之做出贡献的第三方的编码标准和我试图实现其接口的第四方库的现实之间,所以我被困在试图让每个人都开心的同时仍然让一切正常工作 给定特定的回调方法签名,在生成最

我想弄清楚,为什么一个只用于包装null的实用程序类需要
@NonNullable
参数。下面的示例在Eclipse中产生了意外的(对我来说)null类型不匹配错误

Null类型不匹配(类型批注):必需“@NonNull IoSession” 但此表达式的类型为“@Nullable IoSession”

我本来不会这样写代码的,但我被困在我试图为之做出贡献的第三方的编码标准和我试图实现其接口的第四方库的现实之间,所以我被困在试图让每个人都开心的同时仍然让一切正常工作

给定特定的回调方法签名,在生成最少编译器警告的同时(在应用抑制之前),正确处理实现的最佳方法是什么。在尝试
java.util.Optional
之前,我只是做了简单的空检查,但正如您所知,编译器仍然警告

可能的空指针访问:此表达式具有'@Nullable'类型

尽管有空检查。。。另一个第三方编码标准是无编译器错误或警告,同时使用尽可能少的抑制来实现这一点

import static java.util.Optional.ofNullable;

import java.util.Optional;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;

@NonNullByDefault // @NonNullByDefault required and enforced by frameworks coding standards (3rd party) 
public class MyClass extends CumulativeProtocolDecoder {
    
    @Override          // implementation of 4th party callback, necessitating @Nullable annotation
    protected boolean doDecode(@Nullable IoSession s, @Nullable IoBuffer i, @Nullable ProtocolDecoderOutput o) {

        Optional<IoSession> session = Optional.ofNullable(s); // Null type mismatch (type annotations): required '@NonNull IoSession' but this expression has type '@Nullable IoSession'
        Optional<IoBuffer> in = Optional.ofNullable(i); // Null type mismatch (type annotations): required '@NonNull IoBuffer' but this expression has type '@Nullable IoBuffer'
        Optional<ProtocolDecoderOutput> out = ofNullable(o); // Null type mismatch (type annotations): required '@NonNull ProtocolDecoderOutput' but this expression has type '@Nullable ProtocolDecoderOutput'

        
        return true;
    }

}
import static java.util.Optional.ofNullable;
导入java.util.Optional;
导入org.apache.mina.core.buffer.IoBuffer;
导入org.apache.mina.core.session.IoSession;
导入org.apache.mina.filter.codec.cumulativeProtocoldCoder;
导入org.apache.mina.filter.codec.ProtocolDecoderOutput;
默认情况下导入org.eclipse.jdt.annotation.nonNull;
导入org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault/@NonNullByDefault框架编码标准要求并强制执行(第三方)
公共类MyClass扩展了CumulativeProtocoldCoder{
@重写//第四方回调的实现,需要@Nullable注释
受保护的布尔十二进制代码(@Nullable IoSession s、@Nullable IoBuffer i、@Nullable ProtocoldCodeRoutO){
Optional session=Optional.ofNullable(s);//Null类型不匹配(类型批注):必需“@NonNull IoSession”,但此表达式的类型为“@Nullable IoSession”
Optional in=Optional.ofNullable(i);//Null类型不匹配(类型注释):必需“@NonNull IoBuffer”,但此表达式的类型为“@Nullable IoBuffer”
可选out=ofNullable(o);//Null类型不匹配(类型注释):必需“@NONULL ProtocolDecoderOutput”,但此表达式的类型为“@Nullable PROTOCOLDEROUTPUT”
返回true;
}
}

我不理解这些警告。Java
Optional
中没有注释,因此类上的
@NonNullByDefualt
注释必须导致未注释的参数继承
@NonNullable
默认值。似乎有两种不同的空处理范式不能完美地结合在一起。是的,我认为是这样。javadoc声明将此注释应用到声明中会产生这样的效果:声明中包含的类型引用,如果没有null注释,则应将其视为@NonNull。我担心我可能会问一些政治问题。我认为,在这种情况下,我将推回第三方编码标准,因为我为第四方接口提供了具体的实现,而允许第三方在这种上下文中指定注释是没有意义的,因为最终结果与意图相反。这些是OSGI捆绑包,我这里的东西闻起来更像是合同问题,类型不匹配只是这种味道的一种症状。我不理解这些警告。Java
Optional
中没有注释,因此类上的
@NonNullByDefualt
注释必须导致未注释的参数继承
@NonNullable
默认值。似乎有两种不同的空处理范式不能完美地结合在一起。是的,我认为是这样。javadoc声明将此注释应用到声明中会产生这样的效果:声明中包含的类型引用,如果没有null注释,则应将其视为@NonNull。我担心我可能会问一些政治问题。我认为,在这种情况下,我将推回第三方编码标准,因为我为第四方接口提供了具体的实现,而允许第三方在这种上下文中指定注释是没有意义的,因为最终结果与意图相反。这些是OSGI捆绑包,我这里的东西闻起来更像是合同问题,类型不匹配只是这种味道的一种症状。