Type是什么意思!在科特林?

Ray*_*aga 5 type-systems kotlin

我非常了解Kotlin空安全性。我知道 ”?” 在类型(例如:Int?)之后可以用来将变量或值声明为可为空。我也知道!运算符用于返回非空值或引发NPE。

通常,带有“?”的类型 之后将为空,并且不带“?” 是非null。但是当我检查一些类似这样的变量时,我已经看到:

var myVariable:整数!

当您使用Kotlin代码中的Java代码时,就会发生这种情况。

//java code
public class Foo {
    public Integer calcNumber()
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用函数Foo.calcNumber()

//kotlin code
val meh = Foo().calcNumber()
print(meh)
Run Code Online (Sandbox Code Playgroud)

值meh被检查为Int !,而不是Int或Int?。显然,此处的值meh可以为null,但“ IDE”无法正确“检测”。

var a: Int! = 10
Run Code Online (Sandbox Code Playgroud)

是无效的,我的问题是:带“!”的类型到底是什么意思?

use*_*740 11

Type!符号称为平台类型,对于与弱类型 Java 的互操作性至关重要;它的意思是“可空性是未知的”,它允许放松的可空性强制执行。我发现链接问题中的示例令人印象深刻......尽管所有信息都在那里。

以下程序被接受为类型安全,因为 Kotlin 允许 x/Int! 用作“Int 或 Int?”的表达式。

var x = JavaIntegerList.get(0); // Int! type inferred by Kotlin
var y: Int? = x;
var z: Int = x;
Run Code Online (Sandbox Code Playgroud)

但是,如果x 的计算结果为 null ,则对 z (Int) 的赋值将在运行时失败。(对于类实现类型,NPE 可能会延迟使用:基本上,Kotlin 选择“让开”。)

因此,它是为已知值在有效程序中“不能”为空的情况而设计的,尽管该值来自 Kotlin 类型系统之外的 Java。高度适用于 Java 中的int-box- Integer,尽管它对来自 Java 的任何类类型/值都有效。如果 Java 代码可以return null,最安全的做法是Type?立即将值放入 a 中,然后正确处理可空性。

将此与具有类似运行时故障语义的 Java 代码进行比较:

// Java
Integer x = JavaIntegerList.get(0);
Integer y = x;  // "No OP" - all class types in Java are null-able
int z = (int)x; // kaboom *at run-time* if x is null!
Run Code Online (Sandbox Code Playgroud)

虽然用整数表示很简单,如本例所示,但这个问题与 Java 的int/Integer类型并不严格相关。上面链接的文档显示了String!隐式使用的情况,例如item.substring(1),其中 item 是 aString!是允许/类型安全的,但如果item计算为 null,则将在运行时失败。