Types Kotlin类型不匹配!!然后呢?

Types Kotlin类型不匹配!!然后呢?,types,kotlin,mismatch,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.

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

很可能是因为之前你声明变量不可为null:

var peerConnection: PeerConnection
这意味着您不能将
@Nullable
值分配给该变量。 改为:

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

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

注意
结尾。

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

  • 将变量声明为
    PeerConnection?
    ——这意味着您接受可为空的值
  • 将非空断言与
    一起使用。在调用
    createPeerConnection
    的末尾,添加
    。如果为null,则会引发异常
  • 在调用
    createPeerConnection
    后,使用Elvis运算符-add
    ?:[如果返回空值而不带括号,则在此处执行操作]
  • 如果您需要PeerConnection为非null,我建议您选择最后一个选项。如果要检查null,建议您选择此选项,如下所示:

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

    var nonNullVar = getPossibleNull() ?: whatever()
    
    您也可以返回并停止继续执行,但如果您想引发异常,请使用
    而不是Elvis运算符


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

    您能显示您指定的
    对等连接的位置吗?