Java изменяет содержимое класса kotlin на null

У Котлина есть блестящие проверки нулей во время компиляции, используя разделение до «nullable»? и "notnullable". У этого есть KAnnotator, чтобы помочь определить, что объекты, исходящие от Java, являются недействительными или нет. Но что, если какая-то часть не-нулевого класса изменяется?

Подумайте, у нас есть кошка, у которой, конечно, есть голова, которая может повредить. Когда мы просим кошку посмеяться, она гладит головой:

package org.cat class CatHead(){ fun mew(){ println("Mew") } } class Cat(){ var head = CatHead() fun mew(){ head.mew() } } fun main(args:Array<String>){ val cat = Cat() cat.mew() } 

Теперь давайте добавим к этой симпатичной картине кота-маньяка JAVA (CatManiac.java), который отрубает головы кошек, когда он получает:

 import org.cat.*; public class CatManiac { public static void cutCatHead(Cat cat){ cat.setHead(null); } } 

Поэтому, если мы передадим кошку маньяку, он определенно режет голову. И как кошка говорит mew без головы?

 fun main(args:Array<String>){ val cat = Cat() CatManiac.cutCatHead(cat) cat.mew() } 

Мы получаем ошибку выполнения внутри kotlin из-за null, в точке вызова cat.mew ():

 Exception in thread "main" java.lang.IllegalArgumentException". 

Я считаю, что это довольно распространенная проблема, которую мы можем получить при использовании библиотек Java в Котлине. Есть ли способ или какие-либо планы по предупреждению / борьбе с этим?

PS Что-то вроде KAnnotator ищет такие вещи в вашем коде?

Есть шашки для кода Java, которые в дальнейшем будут расширены для кода Kotlin.

Например, тот, который в IntelliJ предупредит вас о проблеме прямо сейчас. Это часть открытого сообщества Community Edition, поэтому вы можете попробовать его сами.

Между тем обратите внимание на то, что Kotlin дает вам большое преимущество перед Java: он выходит из строя прямо в точке, где введена ошибка. Трудно передать null через многие звонки Kotlin и только после этого получить отказ. В Котлине вы в основном получаете ошибку времени выполнения, где сначала вводится недопустимый null.

Intereting Posts
Ошибка плагина Kotlin в студии Android Google Assistant SDK отказывается от аутентифицированного канала как «НЕОПРЕДЕЛЕННЫЙ» Генератор последовательности как вызов функции расширения не работает с «несоответствием типа приемника», что означает «::» в котлине? Как я могу получить время, необходимое для проверки производительности функций в Котлине Как переключить видимость FAB с другим FAB Mockito Wanted, но не вызывается Я не могу использовать Kotlin для Serenity-bdd Запечатанные внутренние классы Котлин: путаница с дженериками Как передать массив строк в намерение электронной почты Android Котлин: Путаница с лямбдами и дженериками Использование publishOn и subscribeOn в потоке приводит к тому, что ничего не происходит Есть ли способ перебрать все поля класса данных без использования отражения? Как использовать RxJava2 combLatest со списком наблюдаемых в Котлине