斯卡拉
在Scala中,哪里可以看到类和类型之间的差异?为什么这种区别很重要?
在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响?
或者是根本,以“固定边界”的类型系统(Nothing
,Null
来我的心)?
爪哇
在Java中还可以识别出上面提到的几点注意事项/差异/问题?
(有关语言的介绍,请参见Type和Class有什么区别?)
当您说“类型”时,我将假设您主要是指静态类型。但是我将在短期内讨论动态类型。
静态类型是可以被静态证明的程序一部分的属性(静态表示“不运行它”)。在静态类型语言中,无论您是否编写,每个表达式都具有一种类型。例如,在Cish“ int x = a * b + c-d”中,a,b,c和d具有类型,a * b具有类型,a * b + c具有类型,而a * b + c -d有一个类型。但是我们只用类型注释了x。在其他语言中,例如Scala,C#,Haskell,SML和F#,即使没有必要。
究竟可以证明哪些属性取决于类型检查器。
另一方面,Scala样式类仅是一组对象的规范。该规范包括一些类型信息,并包含许多实现和表示细节,例如方法主体和私有字段等。在Scala中,类还指定了一些模块边界。
许多语言都有类型但没有类,许多语言都有类但没有(静态)类型。
类型和类之间有几个明显的区别。List [String]是类型,但不是类。在Scala列表中,类是类,但通常不是类型(实际上是更高种类的类型)。在C#中,List不是任何类型,在Java中,它是“原始类型”。
Scala提供结构类型。{def foo:Bar}表示任何证明具有foo方法且返回Bar的对象,而与类无关。它是类型,而不是类。
可以使用类型参数来抽象类型。当您编写def foo [T](x:T)= ...时,则在foo T的内部是一个类型。但是T不是一个类。
类型可以在Scala中是虚拟的(即“抽象类型成员”),但是今天类不能在Scala中进行虚拟化(尽管有一种繁重的方式来编码虚拟类https://wiki.scala-lang.org/display/ SIW / VirtualClassesDesign)
现在,动态类型。动态类型是运行时在执行某些操作之前自动检查的对象的属性。在基于动态类型的基于类的OO语言中,类型和类之间存在很强的相关性。同样的事情发生在诸如Scala和Java之类的JVM语言上,它们具有只能动态检查的操作,例如反射和转换。在那些语言中,“类型擦除”或多或少意味着大多数对象的动态类型与它们的类相同。或多或少。这是不正确的,例如,通常不会删除数组,以便运行时可以区分Array [Int]和Array [String]。但是请记住我的广义定义“动态类型是运行时自动检查的对象的属性”。使用反射时,可以将任何消息发送到任何对象。如果对象支持该消息,则一切正常。因此,将所有可能像鸭子一样发出嘎嘎声的对象称为动态类型是有意义的,即使它不是类。这就是Python和Ruby社区所谓的“鸭子类型”的本质。同样,按照我的广义定义,就大多数语言而言,运行时会自动检查数字以确保您不会被零除,从这个意义上说,“零”也是一种动态类型。通过将零(或非零)设置为静态类型,很少有语言可以静态证明这一点。即使这不是一堂课 这就是Python和Ruby社区所谓的“鸭子类型”的本质。同样,按照我的广义定义,就大多数语言而言,运行时会自动检查数字以确保您不会被零除,从这个意义上说,“零”也是一种动态类型。通过将零(或非零)设置为静态类型,很少有语言可以静态证明这一点。即使这不是一堂课 这就是Python和Ruby社区所谓的“鸭子类型”的本质。同样,按照我的广义定义,就大多数语言而言,运行时会自动检查数字以确保您不会被零除,从这个意义上说,“零”也是一种动态类型。通过将零(或非零)设置为静态类型,很少有语言可以静态证明这一点。
最后,就像其他人提到的那样,有像int这样的类型没有实现细节的类,有像Null和Any这样的类型有点特殊,但是可以有但没有,还有像Nothing这样的类型却没有。甚至没有任何值,更不用说一个类了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句