预期类型在Java中不接受null,但在Kotlin中该值可能为null
我正在构建一个体育应用程序,在编译过程中遇到了一个问题。getCachedSubmission函数中的submission变量为null,似乎需要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.
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。我没发现。