00:00
接下来就是我们的重点内容了,Skyva里边的数据类型啊,那在这之前我们首先还是先来回顾一下Java里边的数据类型有哪些,那我们都知道啊,Java里边有八大基本数据类型啊,就是传说中的bit short int long float double bulling char啊,这八种基本数据类型,这是Java里边数据类型的一个基础啊,所有的类型其实都是基于他们产生出来的,那除了基本数据类型之外呢,Java另外的一大类就是所谓的引用类型啊,我们如果要是自己定义一个类,然后呢,创建一个对象,那么它的类型其实就应该是一个引用类型,而对于我们八大基本数据类型相对应的啊,他们在引用类型里边都有一个对应的包装类。啊,那其实大家就会发现了,在后续啊,我们对于Java进行一些包装处理的过程当中,高级的一些集合类型的数据结构,其实里边的数据类型用到的都是包装类,这看起来好像就把引用类型和基本类型统一在一起了,但是大家要注意啊,即使我们已经有了对应的包装类,但是呢,与此同时还是存在它的基本类型的诶,所以如果之前对于这个Java有有学习经历,或者说有比较深刻了解的同学,肯定就会曾经有过这样的困惑啊,就是我们用着用着往往就不知道诶,怎么有时候这个东西大写有时候小写,有时候是基本数据类型,有时候是包装类型呢?
01:31
哎,这个往往是学习Java的同学容易迷惑的一个一个点,而且大家要注意,就是基本数据类型和引用类型,他们是没有共同的祖先的啊,那有同学可能说,诶,不是Java里面有一个object类吗?哎,所谓的这个object类。我们知道阿是Java里边一切所有的类,直接或者间接的那个父类,对吧?哎,那么所以这里边我们的包装类型其实都是它的子类,但是呢,基本数据类型跟它是一点关系都没有的啊,所以它可以说是所有引用类型的对象类型的父类。
02:10
那那这样看起来的话,基本类型和引用类型还是完全割裂开的两大部分,他们并没有办法完全的统一在一起,所以我们说从这个意义上讲,阿瓦并不是一个真正意义上的面对对象的语言啊,因为你如果要是面对对象的话,我们所有的这个类型就都应该是对象的引用类型啊,为什么它还会有基本数据类型呢?所以这其实是Java的一个遗留问题,所以基于这样的考虑,LA在设计它的数据类型的过程当中,自然就排除掉了基本数据类型这样的一个说法,哎,所以大家看一下skyla里面的数据类型又是什么样的呢?诶,这张图就可以把所有的skyla数据类型全部涵盖在里边,他们的继承关系、转换关系也是一目了然的,在这张图里边,我们可以看到。
03:03
在scla里边,它真正的面对对象了啊,什么叫真正面对对象呢?就是我处理的一切的东西,一切的数据都是对象,那么所有的对象它在类型系统里边是什么样的呢?它们都有一个共同的父类,叫做any,所以大家看到整个这个类型系统里边啊,它相当于是一个类型数,就像一个大的家族一样。共同的祖先就是安妮这样的一个类,安妮大家知道是任何的任意的嘛,所以当然就可以表示任意的数据类型了,然后基于这个any下边它又分成了两支啊,两个分支,那么一大分支就是所谓的数值类型,叫做any value,大家看any Val,另外一类呢,叫做any re ref,其实就是reference嘛,就是任意的引用类型啊,所以后面我们就会看到啊,之前对应在Java里边,我们有基本数据类型和引用类型,而在SKY里边呢,我们所有的一切都是安妮的子类,而在any里边再把它分开,是any value任意值,还是any reference任意引用。
04:16
啊,那所以接下来我们就看一下当前的这个any value任意值里边包含哪些类型啊,这个我们就看到了,这不就是之前在Java里边看到的那些基本数据类型对应的包装类吗?诶,这里边区别只是在于那那八大类型,其实这里边基本上都有啊,大家看到这个,呃,Double float long in short bit bulling char这八种都有,只不过区别就在于在Java里边整形整数类型的这个包装类叫做inte,而在scla里边没那么长了,直接就叫做int,大写的int,然后在这张图里边,大家看到除了这个实箭头之外,还有虚箭头,那在这张图里边呢,实箭头表示的是。
05:03
呃,就是这个类型的继承关系,大家看到它是sub type子类型啊,所以你看到any value是any的子类,那么下边的这个所有的对应的这些基本的类型啊,都是any value的子类,然后接下来还有他们对应的这个虚箭头,虚箭头表示的是什么呢?表示的是影视转换的类型,影做影视转换的方向,或者说这个呃,遵守的规则,也就是说。这个所谓的skyla里面的影视转换,其实就是我们所说的自动类型转换了啊,大家看这个bitt,它的精度比较低,然后它就可以转换成自动转换成short,而就是我们所说的这个做计算混合计算的时候的类型提升嘛,啊,Bitt提升成short short提升成int int提升成long,再提升成float double对吧?哎,这就是他们完整的这个精度转换,自动类型转换的顺序,当然这里边有一个比较特殊的就是char char是跟BAT short没有关系,它是直接转换成int的,这个后续我们讲到数据类型转换的时候,再给大家详细展开,然后除了大家比较熟悉的这八大类型之外,在any value,在这个任意值类型里边呢,还有一个比较特殊的叫做。
06:17
大家看到了叫做string options string OPS,我们看到string本身是字符串嘛,诶,那大家可能会想到,那string本身是不是也应该属于any value呢?诶这个大家要注意啊,为了跟Java里边兼容,因为大家知道在Java里边string其实是一种引用类数据类型啊,所以在这个skyla里边呢,本身的string。这个类型它其实就是Java里边的string类型,所以本身呢,它也是属于引用类型里边的。诶,那这个大家用起来有时候就觉得不太方便对吧,就觉得你这个字符串本身它应该是一个值嘛,所以呢,SC里面就专门的又包装了一个值类型的数据结构,叫做string offs,大家可以认为是对于string Java里边string类的一个增强,一个优化啊,它是一个真正意义上的直类型,然后另外还有一个比较特殊的直类型叫做。
07:15
Unit。Unit,这个我们之前在点hello word代码的时候,大家也请曾经注意到过,曾经看到过,就是我们当前没方法啊,直接DEF一个ma,那么它的返回值我们直接给的类型是冒号,后边给的是unit,哎,那这里边的unit我们当时也说了啊,就跟Java里边的那个void返回表示空。返回值啊,就是这样一个没有返回值,空返回值的一个表达,所以呢,它其实就是表示空值的意思。一般情况它就只用在一些函数的返回值表示没有返回值的这种情况啊,所以大家看到它也是一个any value,一个任意的值类型,只不过它表示的是一个空值。
08:01
那么它里边呢,大家要注意,它里边只有一个对象,这本身是一个类嘛,是一个类型,它里边的一个只有一个对象,那就是所谓的空值,空值怎么样表示呢?就是一个空的小括号啊,所以这个其实跟Java里边还是有所不同的,大家知道我们在B里边定义一个方法啊,呃,我们主方法public static void main,那个voidid是小写的voidid对吧?啊,这个其实是一个关键字了,那当然爸爸在后面我们做做这个引用类型扩展的时候,也专门定义了这样一个VO的大写的这个类。那在这里边SKY里边这个unit呢,大家可以对应着认为就跟Java里边那个大写的void这个类是类似的,而小写的这个关键字这不是一回事,对吧?啊,所以这也是避免了B里边我们会看到啊,你明明认为它的这个返回值是空啊,这明明也可以作为一个类型系统里边的某一种某一种类型出现啊,啊,你直接是单独定义了一个关键字,这个其实是破坏了我们类类型系统的完整性的啊,Scla就把这些问题都解决掉了,这是关于scla里边的any value,任意的值类型,那么除了任意的值类型之外呢?
09:16
还有就是any reference any reference就是所谓的任意的引用类型了啊,大家这里要注意一下,就是所谓的引用类型在SC里边包含什么呢?它其实非常简单,就是所有的scla类。对应的对象生成的那个对象,它的类型就都是any reference,都是引用类型,那那同样我们在KDA里面不是可以引用Java所有的这个Java类库里边的对象里面的方法吗?那么所有的Java类创建出来的对象,它的类型呢,也是any reference,也是引用类型,所以前面我们说了string。就在二里边,本身就是一个Java类,本身就是一个应用类型,所以在SKY里边,为了跟Java兼容,它也是属于any reference。
10:06
那另外还有一个就是LA里边,后面我们会讲到有非常复杂的丰富的集合数据类型,所谓的collection,那么SC里边所有的集合类型collection都是引用类型啊,这就是SC里边any reference啊,引用类型主要包含的三大类,然后除了这三大类之外呢,还有一种比较特殊的引用类型,就是所谓的nu。Nu nu啊,这个nu大家知道它其实表示的是空,对吧,在Java里边就有这样的一个对应的这个数写法嘛,那它里边其实有一个单独的就唯一的一个对象,跟这个空值unit相类似啊,空池里边的单独的一个对象是空括号,那么nu这个类啊,空引用里边的对象呢,就是小写的nu l啊,就是这样一个nu,这跟Java里面是一致的,这里大家需要注意的是在scla里边none这个类呢。
11:04
它是所有其他就是前面我们讲到的啊,SKY的集合,SC类或者Java类,其他所有引用类型的子类。诶,这个为什么呢?啊,大家可能会想到这是因为我们整个这个呃,在代码里边啊,假如说我们随便定义了某种,呃,我现在需要的这个数据类型是一个集合类型啊,或者是一个Java里面的类的类型,但是假如说是空的时候,那怎么办呢?诶,我直接返回档是没有问题的,因为这是它的子类嘛,啊你就不管什么情况下我都可以返回空啊,这样的话就是比较通用的一种写法了。所以当对应的前面的unit表示的是空值,那现在的那表示的就是空引用。那这里面必须还要提的一个,就是大家看到最下边还有一个比较特殊的类型,叫做nothing。啊,Nothing大家知道,英文里边表示的是没有东西,没有任何的东西,什么都没有,哎,所以大家会看到啊,前面这一个unit表示的是空值,它是any value,那么none呢,表示的是空引用,Any reference,那这里边的nothing表示的又是什么呢?哎,它其其实就表示的值也没有,引用也没有,我根本就啥都不知道,我这里边就根本不知道你到底是值类型还是引用类型,我只是知道它是空,它根本就没有类型。
12:25
那所以大家会想到这种用法,它在什么场景里边有意义呢?呃,这个比较特殊啊,它一般情况下就是在一个函数没有明确的返回类型,或者说呃,一般情况是什么情况下就没有明确的返回值呢?就是这个函数根本就不会返回,比方说我们在函数执行的过程当中,直接就抛出异常了,那大家想如果要是函数直接抛出异常就不会返回啊,它就根本不涉及到返回值是什么类型,它不管是引用类型还是值类型都是没有。根本就不考虑它的返回,所以在这种情况下,那这个函数我们定义的时候,还得应该得定义一个它的返回值类型,那定义成什么呢?可以直接定义成nothing啊,所以大家看到这个nothing在这里边要求的是它是所有数据类型的子类,主要就是用在一个函数没有明确返回值的时候用它,呃,抛出异常的时候,我们函数不能正常的退出,正常的返回,这个时候我们就指定它的类型是nothing。
13:28
关于呃,这个空值空引用,还有nothing的这些用法,我们可以到后边再给大家详细的展开,这就是完整的scla的数据类型的结构啊,大家可以把这张图认真的再总结复习一下。
我来说两句