预期类型在Java中不接受null,但在Kotlin中该值可能为null

预期类型在Java中不接受null,但在Kotlin中该值可能为null,java,android,kotlin,Java,Android,Kotlin,我正在构建一个体育应用程序,在编译过程中遇到了一个问题。getCachedSubmission函数中的submission变量为null,似乎需要null句柄,但我不确定。代码如下: import com.bluebeam.premierleaguego.features.model.SubmissionWrapper import com.bluebeam.premierleaguego.data.reddit.RedditAuthentication import com.bluebeam.

我正在构建一个体育应用程序,在编译过程中遇到了一个问题。getCachedSubmission函数中的submission变量为null,似乎需要null句柄,但我不确定。代码如下:

import com.bluebeam.premierleaguego.features.model.SubmissionWrapper
import com.bluebeam.premierleaguego.data.reddit.RedditAuthentication
import com.bluebeam.premierleaguego.data.service.RedditService
import com.google.common.base.Optional
import io.reactivex.Single
import net.dean.jraw.models.CommentSort
import net.dean.jraw.models.Submission
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
import javax.annotation.Nullable

/**
 * Implementation of the [SubmissionRepository] interface. Stores [SubmissionWrapper]s in a map
 * keyed by their id.
 * TODO: should there be a limit to how many submissions are cached?
 */
@Singleton
class SubmissionRepositoryImpl
@Inject constructor(
    val redditAuthentication: RedditAuthentication,
    val redditService: RedditService) : SubmissionRepository {
  private val idToSubmissionMap = HashMap<String, SubmissionWrapper>()

  override fun getSubmission(
      id: String,
      sort: CommentSort,
      forceReload: Boolean): Single<SubmissionWrapper> {
    // Use submission in cache if available and has the right comment sorting.
    if (!forceReload && idToSubmissionMap[id] != null && idToSubmissionMap[id]?.sort == sort) {
      return Single.just(idToSubmissionMap[id])
    }
    return redditService.getSubmission(redditAuthentication.redditClient, id, sort)
        .flatMap { s: Submission ->
          val wrapper = SubmissionWrapper(s)
          wrapper.sort = sort
          idToSubmissionMap[wrapper.id] = wrapper
          Single.just(wrapper)
        }
  }


  override fun getCachedSubmission(id: String): Optional<Submission> {
    val submission = idToSubmissionMap[id]?.submission
    return Optional.of(submission)
  }


  override fun saveSubmission(submissionWrapper: SubmissionWrapper) {
    idToSubmissionMap[submissionWrapper.id] = submissionWrapper
  }

  override fun reset() = idToSubmissionMap.clear()
}
import com.blueeam.premierleaguego.features.model.SubmissionWrapper
导入com.blueeam.premierleaguego.data.reddit.RedditAuthentication
导入com.blueeam.premiereleaguego.data.service.RedditService
导入com.google.common.base.Optional
导入io.reactivex.Single
导入net.dean.jraw.models.CommentSort
导入net.dean.jraw.models.Submission
导入java.util*
导入javax.inject.inject
导入javax.inject.Singleton
导入javax.annotation.Nullable
/**
*[SubmissionRepository]接口的实现。将[SubmissionWrapper]存储在地图中
*由他们的id键入。
*TODO:是否应该限制缓存的提交数量?
*/
@独生子女
类SubmissionRepositoryImpl
@注入构造函数(
val redditAuthentication:redditAuthentication,
val redditService:redditService):提交存储库{
private val idToSubmissionMap=HashMap()
覆盖提交(
id:String,
排序:注释排序,
forceReload:Boolean):单个{
//使用缓存中的提交(如果可用)并具有正确的注释排序。
如果(!forceReload&&idToSubmissionMap[id]!=null&&idToSubmissionMap[id]?.sort==sort){
返回Single.just(idToSubmissionMap[id])
}
返回redditService.getSubmission(redditAuthentication.redditClient,id,排序)
.flatMap{s:提交->
val包装器=提交包装器
wrapper.sort=排序
idToSubmissionMap[wrapper.id]=包装器
单身。只是(包装纸)
}
}
重写getCachedSubmission(id:String):可选{
val提交=idToSubmissionMap[id]?。提交
返回可选。of(提交)
}
覆盖提交(submissionWrapper:submissionWrapper){
idToSubmissionMap[submissionWrapper.id]=submissionWrapper
}
override fun reset()=idToSubmissionMap.clear()
}
我继续从getCachedSubmission函数中得到的错误是:
预期类型在Java中不接受null,但在Kotlin中该值可能为null。如果有任何关于如何解决这一问题的建议,那将很有帮助。谢谢

可选。of
不接受
null
(如果得到一个异常,它将抛出一个异常),但是使用
?。
意味着
提交可以
null
。改为使用
可选。ofNullable

使用变量数据类型旁边的
以允许其接受空值。在
getCachedSubmission
函数中使用
if
语句(该函数也有
)来控制变量为
null
时的信息流

在本例中,我创建了一个
参数
类型为
String?
的变量,以便以后将其更改为null。在try/catch块(为了以防万一,我将其作为额外的异常处理层)中,我将一个参数传递给
getCachedSubmission
,并且在函数中处理信息,以更改在传递的参数为
null
时显示的内容

查看当传递的参数为
null
时会发生什么情况,取消对
参数=null的注释代码行

var argument: String? = "abc"; 
fun main(args: Array<String>) {
    try
    {
        //uncomment me below
        //argument = null;
        argument = getCachedSubmission(argument);
        println(argument);
    }
    catch(e: Exception)
    {
        //Some sort of exception encountered
        println("do nothing");
    }

}
fun getCachedSubmission(parameter: String?): String
{
    var flow = "normal";
    println(parameter);
    if(parameter == null)
    {
        flow = "not normal"
        return flow;
    }

    return flow;
}
var参数:字符串?=“abc”;
趣味主线(args:Array){
尝试
{
//在下面给我取消注释
//参数=null;
参数=getCachedSubmission(参数);
println(参数);
}
捕获(e:例外)
{
//遇到了某种异常
println(“什么也不做”);
}
}
fun getCachedSubmission(参数:String?):String
{
var flow=“正常”;
println(参数);
if(参数==null)
{
flow=“不正常”
回流;
}
回流;
}

希望这能有所帮助。

谢谢你引导我找到正确的解决方案,Alexey!我尝试了可选的。不可用的,它说它无法解决。然后我尝试了Optional.fromNullable,效果非常好。哎呀,您使用的是Guava Optional,而不是标准的Java8。我没发现。