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

时间:2018-07-05 04:11:38

标签: kotlin type-systems

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

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

  

var myVariable:整数!

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

//java code
public class Foo {
    public Integer calcNumber()
    {
        return null;
    }
}

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

//kotlin code
val meh = Foo().calcNumber()
print(meh)

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

var a: Int! = 10

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

1 个答案:

答案 0 :(得分:4)

Type!符号称为Platform Type and is critical for Interoperability with the weaker-typed Java;这意味着“无效性未知”,并且允许宽松的无效性强制执行。我在linked question中发现了令人难以置信的示例。尽管所有信息都在那里。

由于Kotlin允许使用x / Int的类型,因此以下程序被视为类型安全。表达式用作“整数还是整数?”。

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

但是,如果x评估为null,则在运行时对z的分配将失败。 (对于类实现类型,NPE可能会延迟使用:基本上,Kotlin选择“摆脱干扰”。)

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

将此与具有类似运行时故障语义的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!

尽管以相对简单的显示为例,但此问题与Java的int/Integer类型并不严格相关。上面链接的文档显示了String!被隐式使用的情况,给出了一个示例,即item.substring(1)(项目为String!,是允许的/类型安全的,但如果在运行时失败, item计算为空。