如何从不带参数的java中的静态泛型函数转换?

Yul*_*iri 3 java generics guava

在我用过guava库的项目中.我有这样的事情:

Optional< User > loginUser( ) {
    User user = storage.get( request.id );

    boolean success = ( user == null ) ? 
            false : user.password.equals( request.password );

    return success == true ? Optional.of( user ) :Optional.absent ( );
}
Run Code Online (Sandbox Code Playgroud)

和编译器给我错误:

无法从Optional <Object>强制转换为Optional <User>

更多关于这方面的工作:

Optional< User > empty = Optional.absent ( );
return success == true ? Optional.of( user ) : empty;
Run Code Online (Sandbox Code Playgroud)

如何逃避创建空变量?

Roh*_*ain 8

在条件运算符的情况下,这是类型推断的已知错误.Java泛型不会从返回类型中推断出某些类型.解决方法是提供显式类型参数:

return success == true ? Optional.of( user ) :Optional.<User>absent ( );
Run Code Online (Sandbox Code Playgroud)

哦,请摆脱== true.这根本不是必需的.另外,其他条件运算符:

 boolean success = ( user == null ) ? false 
                                    : user.password.equals( request.password );
Run Code Online (Sandbox Code Playgroud)

可以替换为:

boolean success = (user != null) && user.password.equals( request.password )
Run Code Online (Sandbox Code Playgroud)


qqi*_*ihq 6

好吧,似乎我的猜测是正确的;-)所以这里作为官方答案:

Optional.<User>absent()

顺便说一句,为了简洁起见,你可以减少到:

return success ? Optional.of( user ) :Optional.<User>absent ( );