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
。您在这里有三个选择:
- 将 var 声明为
PeerConnection?
- 这意味着您接受可为 null 的值
- 对
!!
使用非空断言。在调用 createPeerConnection
的末尾添加 !!
。如果它为空,则抛出异常。
- 使用 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,请注意,这意味着您稍后必须对调用进行空值检查。
我最近才开始学习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
。您在这里有三个选择:
- 将 var 声明为
PeerConnection?
- 这意味着您接受可为 null 的值 - 对
!!
使用非空断言。在调用createPeerConnection
的末尾添加!!
。如果它为空,则抛出异常。 - 使用 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,请注意,这意味着您稍后必须对调用进行空值检查。