При вызове функции Notable-annotated Java от Kotlin мы получаем возвращаемые значения с гибким типом, обозначенные восклицательными знаками, например. String!
.
Kotlin молча разрешает назначать эти гибкие значения нормальному непустому типу, например. String
, что может вызвать NullPointerExceptions во время выполнения.
Я бы предпочел получить предупреждения или ошибки компилятора для таких назначений. Альтернативно, рассматривайте типы платформ как эквивалентные типам NULL (например, String?
).
В качестве примера, с этим кодом Java:
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class NullTest {
private String maybe() {
if (SystemClock.elapsedRealtimeNanos() % 2 == 0) {
return null;
}
return "ok";
}
public String annotatedNothing() { return maybe(); }
@Nullable public String annotatedNullable() { return maybe(); }
@NonNull public String annotatedNonNull() { return "ok"; }
}
... и следующий код Котлина, я хотел бы получить ошибки в двух новых строках (см. комментарии):
fun testnulls() {
val obj = NullTest()
val nullExact: String = obj.annotatedNullable() // already gives an error
val nullMaybe: String? = obj.annotatedNullable()
val nullInfer = obj.annotatedNullable()
val okayExact: String = obj.annotatedNonNull()
val okayMaybe: String? = obj.annotatedNonNull()
val okayInfer = obj.annotatedNonNull()
val bareExact: String = obj.annotatedNothing() // I want a compiler error here
val bareMaybe: String? = obj.annotatedNothing()
val bareInfer = obj.annotatedNothing()
print("length " + nullExact.length)
print("length " + nullMaybe.length) // already gives an error
print("length " + nullInfer.length) // already gives an error
print("length " + okayExact.length)
print("length " + okayMaybe.length) // already gives an error
print("length " + okayInfer.length)
print("length " + bareExact.length)
print("length " + bareMaybe.length) // already gives an error
print("length " + bareInfer.length) // I want a compiler error here
}
Дело в том, что это заставит меня добавить нулевые проверки или !!
, убедившись, что я, по крайней мере, должен быть явным.
Возможно ли это?
В комментариях этого сообщения 2014 JetBrains, когда они представили платформы/гибкие типы, похоже, что они планировали добавить опцию чтобы предупредить об этих ситуациях, но я не смог найти дополнительную информацию об этом.