我刚刚开始学习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的不了解才能解决问题,你能帮助我吗?
答案 0 :(得分:2)
很可能因为早些时候你已经将变量声明为不可为空:
var peerConnection: PeerConnection
这意味着您无法为该变量分配@Nullable
值。
将其更改为:
var peerConnection: PeerConnection?
或者您可以强制返回的值为非null(我不建议),在这种情况下:
peerConnection = peerConnectionFactory.createPeerConnection(rtcConfig, getPeerConnectionMediaConstraints(), videoPeerConnectionListener)!!
注意最后的!!
。
答案 1 :(得分:1)
由于该方法可以为空,这意味着它有可能返回null。这意味着您不能将其声明为非空PeerConnection
。你有三个选择:
PeerConnection?
- 这意味着您接受可以为空的值!!
使用非空断言。在致电createPeerConnection
时,请添加!!
。如果它为null,则抛出异常。?: [something to do here if it returns null without brackets]
后添加createPeerConnection
。如果您需要PeerConnection为非null,我建议您选择最后一个选项。如果您要检查null,它也是推荐的选项,如:
var someNullableVar = getPossibleNull()
if(someNullableVar == null) someNullableVar = whatever();
与:
相同var nonNullVar = getPossibleNull() ?: whatever()
您也可以返回并停止继续执行,但如果要抛出异常,请使用!!
而不是Elvis运算符。
如果您选择#1选项,请注意这意味着您以后必须对通话进行空检查。