预期types不接受Java中的空值,但Kotlin中的值可能为空

我正在构建一个运动应用程序,并在编译期间遇到问题。 getCachedSubmission函数内部的提交variables为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() override fun getSubmission( id: String, sort: CommentSort, forceReload: Boolean): Single { // 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 { val submission = idToSubmissionMap[id]?.submission return Optional.of(submission) } override fun saveSubmission(submissionWrapper: SubmissionWrapper) { idToSubmissionMap[submissionWrapper.id] = submissionWrapper } override fun reset() = idToSubmissionMap.clear() } 

我继续从getCachedSubmission函数中得到的错误是:Expectedtypes不接受Java中的空值,但Kotlin中的值可能为null。 如果有任何建议如何解决这将是有益的。 谢谢!

Optional.of .of不接受null (它会抛出一个exception,如果它得到一个),但使用?. 意味着submission可以为null 。 改为使用Optional.ofNullable

使用? 在variables数据types旁边允许它接受一个空值。 如果variables为nullifgetCachedSubmission函数(也有? )中有一个if语句来控制信息流。

在这个例子中,我创建了一个types为String?argumentvariablesString? 以便稍后将其更改为空。 在try / catch块(我把它作为额外的一层exception处理以防万一),我把一个parameter passing给getCachedSubmission ,并且在函数中处理信息以改变如果传递的参数为null则显示的内容。

若要查看传递参数时发生的情况,请为null取消注释argument = null; 代码行。

 var argument: String? = "abc"; fun main(args: Array) { 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; } 

希望这可以帮助。