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

时间:2014-02-15 11:32:49

标签: 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 ( );
}

和编译器给我错误:

无法从Optional&lt; <对象&gt;到可选&lt;用户&gt;

这里有更多可行的方法:

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

如何逃避创建空变量?

2 个答案:

答案 0 :(得分:8)

这是known bug,在条件运算符的情况下具有类型推断。 Java泛型不会从返回类型中推断出某些类型。解决方法是提供显式类型参数:

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

哦,请摆脱== true。这根本不是必需的。另外,另一个条件运算符:

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

可以替换为:

boolean success = (user != null) && user.password.equals( request.password )

答案 1 :(得分:6)

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

Optional.<User>absent()

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

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