Несоответствие типа Kotlin! а также? - PullRequest
0 голосов
/ 05 мая 2018

Я только недавно начал изучать 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 голосов
/ 05 мая 2018

Поскольку метод имеет значение null, это означает, что у него есть шанс вернуть null. Это означает, что вы не можете объявить его как ненулевое PeerConnection. У вас есть три варианта:

  1. Объявите переменную как PeerConnection? - это означает, что вы можете принимать значения NULL
  2. Используйте ненулевое утверждение с !!. В конце разговора к createPeerConnection добавьте !!. Это вызывает исключение, если оно нулевое.
  3. Используйте оператор Элвиса - добавьте ?: [something to do here if it returns null without brackets] после звонка на createPeerConnection.

Если вам нужно, чтобы PeerConnection был ненулевым, я рекомендую вам выбрать последний вариант. Это также рекомендуемый вариант, если вы проверяете на ноль, как:

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

совпадает с:

var nonNullVar = getPossibleNull() ?: whatever()

Вы также можете вернуть и остановить продолжение выполнения, но если вы хотите вызвать исключение, используйте !! вместо оператора Elvis.

Однако, если вы выберете опцию № 1, учтите, что это означает, что вам придется выполнять нулевые проверки вызовов позже.

0 голосов
/ 05 мая 2018

Скорее всего, потому что раньше вы объявляли переменную не обнуляемой:

var peerConnection: PeerConnection

А это значит, что вы не можете присвоить значение @Nullable этой переменной. Измените это на:

var peerConnection: PeerConnection?

Или вы можете сделать так, чтобы возвращаемое значение было ненулевым (что я не рекомендую), в этом случае:

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

Обратите внимание на !! в конце.

...