Kotlin 类型是什么意思!在科特林?
我很清楚Kotlin的零安全性。我知道类型(例如:Int?)后的“?”可用于将变量或值声明为可空。我也知道!!运算符用于返回非空值或抛出NPE 一般来说,后面有“?”的类型是可空的,没有“?”的类型是非空的。但当我检查一些变量时,我看到了如下情况: var myVariable:Int 当您使用kotlin代码中的java代码时,就会发生这种情况Kotlin 类型是什么意思!在科特林?,kotlin,type-systems,Kotlin,Type Systems,我很清楚Kotlin的零安全性。我知道类型(例如:Int?)后的“?”可用于将变量或值声明为可空。我也知道!!运算符用于返回非空值或抛出NPE 一般来说,后面有“?”的类型是可空的,没有“?”的类型是非空的。但当我检查一些变量时,我看到了如下情况: var myVariable:Int 当您使用kotlin代码中的java代码时,就会发生这种情况 //java code public class Foo { public Integer calcNumber() {
//java code
public class Foo {
public Integer calcNumber()
{
return null;
}
}
如果我使用Foo.calcNumber()函数
将值meh检查为Int!,不是Int也不是Int?。显然,这里的值meh可以为null,但“IDE”无法正确地“检测到”
作为
无效,我的问题是:带“!”的类型到底是什么意思?类型代码>符号称为a;这意味着“空能力是未知的”,它允许放松空能力的强制执行。我在这本书中找到了一些例子。。尽管所有的信息都在那里 以下程序被认为是类型安全的,因为Kotlin允许x/Int的类型!要用作“Int或Int”的表达式 但是,如果x的计算结果为null,则对z(Int)的赋值将在运行时失败。(对于类实现类型,NPE可能会延迟使用:基本上,Kotlin选择“让路”。) 因此,它设计用于已知值“不能”在有效程序中为null的情况,尽管该值来自Kotlin类型系统之外的Java。高度适用于Java中的
int
-box-Integer
,尽管它对来自Java的任何类类型/值都有效。如果Java代码可以返回null
,那么最安全的做法是立即将值放入类型?
,然后正确处理null功能
将其与具有类似运行时故障语义的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!
虽然使用int很容易显示,如本例中所示,但这个问题与Java的int/Integer
类型没有严格的关系。上面链接的文档显示了String代码>被隐式使用,示例为item.substring(1)
,其中item是字符串代码>是允许的/类型安全的,但如果项
的计算结果为空,则在运行时将失败。“平台类型”-;相关问题应提供更多信息。
var a: Int! = 10
var x = JavaIntegerList.get(0); // Int! type inferred by Kotlin
var y: Int? = x;
var z: Int = x;
// 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!