美文网首页
2.4.2 Unit类型:让函数调用皆为表达式 2021-0

2.4.2 Unit类型:让函数调用皆为表达式 2021-0

作者: AndYMJ | 来源:发表于2021-07-14 23:29 被阅读0次

之所以不能说Java中的函数调用都是表达式,是因为存在特例viod。众所周知,在Java中如果声明的函数没有返回值,那么他就需要用void来修饰。如:

void foo(){

System.out.println("return nothing")

}

所以foo()就不具有值和类型信息,它就不能算作一个表达式。同时,这与函数式语言中的函数概念也存在冲突,在Kotlin、Scala这些语言中,函数在所有的情况下都具有返回类型,所以它们引入了Unit来代替Java中的void关键字。

-------------------------------------

void与Viod

当你在描述void的时候,需要注意首字母的大小写,因为Java在语言层设计一个Void类。java.lang.Void类似java.lang.Integer,Integer是为了对基本类型int的实例进行装箱操作,Void的设计则是为了对应void。由于void表示没有返回值,所以Void并不能具有实例,它继承自Object。

---------------------------------------

如何理解Unit?其实它与int一样,都是一种类型,然而它不代表任何信息,用面向对象的术语来描述就是一个单例,它的实例只有一个,可写为()。

那么,Kotlin为什么要引入Unit啦?一个很大的原因是函数侧重于组合,尤其是很多高阶函数,在源码实现的时候都是采用泛型来实现的,然而void在涉及泛型的情况下会存在问题。

我们先来看个例子,Java这门语言并不天然支持函数是头等公民,我们现在来尝试模拟出一种函数类型

interface Function<Arg,Return>{

       Return apply(Arg arg);

}

Function<String,Integer> stringLenth = new Function<String,Integer>(){

public Integer apply(){

        return arg.length();

    }

};

int result = stringLenth .apply("hello")

//运行结果

5

看上去似乎没什么问题。我们再来改造一下,这次希望重新实现一个print方法。于是,难题出现了,Return的类型用什么来表示啦?可能你会想到void,但Java是不能这么干的。无奈之下,我们只能把Return换成Void,即Function<String,Viod>,由于Void没有实例,则返回一个null。这种做法严格意义上讲,相当丑陋。

Java8实际解决办法是通过引入Action<T>这种函数式接口来解决问题,比如:

相关文章

  • 2.4.2 Unit类型:让函数调用皆为表达式 2021-0

    之所以不能说Java中的函数调用都是表达式,是因为存在特例viod。众所周知,在Java中如果声明的函数没有返回值...

  • Kotlin高阶函数的使用

    Lambda表达式 Lambda表达式 函数类型定义 (String,Int)->Unit为一个函数类型,即参数、...

  • 第二讲 控制语句和函数

    本章主要内容 if表达式 循环 void类型 Unit 函数 2.1 if表达式 scala的 if表达式和 ja...

  • 基本语法

    定义包 定义函数 将表达式作为函数体、返回值类型⾃动推断的函数: 函数返回⽆意义的值: Unit 返回类型可以省略...

  • day11-高阶函数

    函数作为变量 1.函数调用表达式 函数调用表达式 - 调用函数的语句普通值能做的事情函数调用表达式都可以做 2...

  • Scala 传名参数和传值参数(by-name/by-value

    1. 介绍 传值参数在函数调用之前表达式会被求值,例如Int,Long等数值参数类型;传名参数在函数调用前表达式不...

  • Day11-总结

    一.函数作为变量 1.函数调用表达式 函数调用表达式 - 调用函数的语句普通值能做的事,函数调用表达式都可以做 2...

  • 函数

    函数类型表达式 调用签名 构造签名 泛型函数 输入类型与输出类型有关,或者两个输入类型以某种方式关联根据参数类型判...

  • Kotlin基础语法

    表达式函数可省略返回类型 返回类型自动推导 unit相当于java中的void 可省略 kotlin中默认可见性为...

  • javascript学习笔记

    自调用函数 函数表达式可以 "自调用"。如果表达式后面紧跟 () ,则会自动调用。 不能自调用声明的函数。通过添加...

网友评论

      本文标题:2.4.2 Unit类型:让函数调用皆为表达式 2021-0

      本文链接:https://www.haomeiwen.com/subject/qjuupltx.html