Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中可以为null的返回值是否可以放入kotlin中声明为非null的变量中_Java_Android_Kotlin_Nullable - Fatal编程技术网

在java中可以为null的返回值是否可以放入kotlin中声明为非null的变量中

在java中可以为null的返回值是否可以放入kotlin中声明为非null的变量中,java,android,kotlin,nullable,Java,Android,Kotlin,Nullable,作为Kotlin的一名新开发人员,我第一次遇到了一种情况,我很乐意得到解释。 视图的方法findViewById可以返回null(我作为java开发人员从知识中了解到这一点,但我很高兴知道我是否能够理解只有根据方法签名才能返回null值,而无需打开android文档) 但是我很惊讶编译器没有阻止我将返回值赋给一个不可为空的视图对象。它不应该阻止这个任务吗?ASAIK,以下分配将不会编译: var str1 : String? = "just a string" var str

作为Kotlin的一名新开发人员,我第一次遇到了一种情况,我很乐意得到解释。 视图的方法findViewById可以返回null(我作为java开发人员从知识中了解到这一点,但我很高兴知道我是否能够理解只有根据方法签名才能返回null值,而无需打开android文档) 但是我很惊讶编译器没有阻止我将返回值赋给一个不可为空的视图对象。它不应该阻止这个任务吗?ASAIK,以下分配将不会编译:

var str1 : String? = "just a string"
var str2: String = str1

那么区别是什么呢?

在kotlin中,如果不进行null检查,就不能将可为null的值放入不可为null的变量中

这将编译

var str1 : String? = "just a string"
if(str1!=null){
    var str2: String = str1
}

科特林的无效性检查是科特林公司虚构的。一旦生成了类文件,那个问号(或缺少)就消失了。编译器没有任何线索。是的,方法签名包含此信息(如果您有一个文件,其中包含:
fun helloWorld():String{return“Hello”}
,并对其进行编译,然后编写调用
helloWorld()
的其他代码,则该代码知道helloWorld函数已声明为返回非空字符串,即使您没有源文件)-但就java VM可执行文件而言,这是一个注释

这样,它与泛型完全相同。您可以这样做:

public void iWillMessYouUp(List<String> list) {
    List raw = list; // this generates a warning, but compiles.
    raw.add(5); // this compiles. I just added an Integer to a String list...
}

List<String> myList = new ArrayList<String>();
iWillMessYouUp(myList);
for (Integer i : myList) System.out.println(i);
获取对伪代码的转换:

METHOD say(Ljava/lang/String;)V {
    if (in == null) throw new NullPointerException("in");
    java.lang.System.out.println(in);
}
一个关于kotlinc吐出的内容的快速
javap
将告诉您它是否做到了这一点

这让我们看到了无效行为

事实证明,有4种方法可以实现泛型。要表示“数字列表”,有4种方法:

List<Number> // invariant
List<? extends Number> // covariant
List<? super Number> // contravariant
List // raw
List//

List@rzwitsterloot,非常感谢。但我很抱歉。你提出了一个小问题,然后把它变成了一个大问题。为什么要谈变异,反变异的世界?我只是试着理解两个小问题,但读了你所有的帖子后,我还是什么都不懂。我会同意你的回答,因为我付出了很大的努力,但不幸的是,我仍然不明白答案issue@I仍然不理解如何知道一个方法是否可以根据其签名返回null,并且仍然不理解为什么可以将返回的null分配给非null变量。您给出了一个helloWorld方法的示例,那么helloWorld和findViewById方法之间有什么不同呢?你还提到了2个空值和3个3,我对你说的话一无所知about@DorVak因为空值是“类型标记”,虽然它看起来非常简单,但事实并非如此。我希望你能对java的泛型有多复杂有所了解,但如果你不知道,我可以看出这有点难处理。尽管如此,事实仍然存在:类型标记,即使是kotlin看似简单的空值,也是极其复杂的,特别是考虑到kotlin需要与没有此标记的代码进行互操作的事实。关键是在kotlin中,
var str1:String=“Hello”
表示str1的类型为
@NonNull String
。有标签。以及
var str2=String?=“Hello”
也被标记为:
@Nullable String
。但是,java变量:
private String str1=“Hello”
未标记。科特林不知道。它看起来是一样的(“java中的字符串”,kotlin中的字符串),但在java中它是“遗留的空字符串”,在kotlin中它是“非空字符串”,这是一个差异的海洋。我熟悉java中的泛型并理解您在那里给出的示例。但我没有发现它与我所问的问题有什么关系。有趣的是,泛型是我在答案中唯一能理解的东西:)你读过了吗?基本上,当您从kotlin调用java时,您会得到一个“平台类型”,它具有宽松的可空性检查。此外,您可能还想知道其中包含比以前更多的可空性注释。@Pawel,是的,我在30分钟前读过:),但我无法理解“平台类型”的定义。你能用简单的话解释一下吗?它有未定义的可空性,所以你可以自由地将它分配给可空或不可空字段,但在后一种情况下,你必须确保该值永远不会实际为空,否则你的程序将在运行时崩溃。只有当您访问没有任何可空性注释的java字段或方法时,才会发生这种情况。
List<Number> // invariant
List<? extends Number> // covariant
List<? super Number> // contravariant
List // raw