Kotlin 类型不匹配!!和?

Kotlin type mismatch !! and?

我最近才开始学习kotlin,当我将Webrtc 版本更改为较新版本(1.0.22920) 时遇到以下问题:

 Type mismatch: inferred type is PeerConnection? but PeerConnection was expected

这是发生错误的代码部分:

val rtcConfig = PeerConnection.RTCConfiguration(iceServers)
peerConnection = peerConnectionFactory.createPeerConnection(rtcConfig, getPeerConnectionMediaConstraints(), videoPeerConnectionListener)

这很可能是因为在 Webrtc 库中 createPeerConnection 变成了@Nullable:

@Nullable
      public PeerConnection createPeerConnection(RTCConfiguration rtcConfig, MediaConstraints constraints, Observer observer) {
        long nativeObserver = PeerConnection.createNativePeerConnectionObserver(observer);
        if (nativeObserver == 0L) {
            return null;
        } else {
            long nativePeerConnection = nativeCreatePeerConnection(this.nativeFactory, rtcConfig, constraints, nativeObserver);
            return nativePeerConnection == 0L ? null : new PeerConnection(nativePeerConnection);
        }
    }

尝试放置?和 !!在不同的地方都不起作用。

我认为只有我对 kotlin 的了解很少才能解决问题,你能帮帮我吗?

很可能是因为您之前已将变量声明为不可空:

var peerConnection: PeerConnection

这意味着您不能为该变量分配 @Nullable 值。 将其更改为:

var peerConnection: PeerConnection?

或者您可以强制返回的值为非空值(我不推荐这样做),在这种情况下:

peerConnection = peerConnectionFactory.createPeerConnection(rtcConfig, getPeerConnectionMediaConstraints(), videoPeerConnectionListener)!!

注意最后的 !!

由于该方法可以为空,这意味着它有可能 return 为空。这意味着您不能将其声明为非空 PeerConnection。您在这里有三个选择:

  1. 将 var 声明为 PeerConnection? - 这意味着您接受可为 null 的值
  2. !! 使用非空断言。在调用 createPeerConnection 的末尾添加 !!。如果它为空,则抛出异常。
  3. 使用 Elvis 运算符 - 在调用 createPeerConnection 后添加 ?: [something to do here if it returns null without brackets]

如果您需要 PeerConnection 为非空,我建议您选择最后一个选项。如果您要检查 null,这也是一个推荐的选项,如:

var someNullableVar = getPossibleNull()
if(someNullableVar == null) someNullableVar = whatever();

等同于:

var nonNullVar = getPossibleNull() ?: whatever()

你也可以return并停止继续执行,但如果你想抛出异常,请使用!!而不是Elvis运算符。

如果您选择选项 #1,请注意,这意味着您稍后必须对调用进行空值检查。