Kotlin型不匹配!!和?

时间:2018-05-05 05:31:12

标签: types kotlin mismatch

我刚刚开始学习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的不了解才能解决问题,你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

很可能因为早些时候你已经将变量声明为不可为空:

var peerConnection: PeerConnection

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

var peerConnection: PeerConnection?

或者您可以强制返回的值为非null(我不建议),在这种情况下:

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

注意最后的!!

答案 1 :(得分:1)

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

  1. 将var声明为PeerConnection? - 这意味着您接受可以为空的值
  2. !!使用非空断言。在致电createPeerConnection时,请添加!!。如果它为null,则抛出异常。
  3. 使用Elvis运算符 - 在调用?: [something to do here if it returns null without brackets]后添加createPeerConnection
  4. 如果您需要PeerConnection为非null,我建议您选择最后一个选项。如果您要检查null,它也是推荐的选项,如:

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

    与:

    相同
    var nonNullVar = getPossibleNull() ?: whatever()
    

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

    如果您选择#1选项,请注意这意味着您以后必须对通话进行空检查。