预期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为null
, if
在getCachedSubmission
函数(也有?
)中有一个if
语句来控制信息流。
在这个例子中,我创建了一个types为String?
的argument
variablesString?
以便稍后将其更改为空。 在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; }
希望这可以帮助。