Scala(和Java)中的类和类型之间有什么区别?

SOC:

斯卡拉

在Scala中,哪里可以看到类和类型之间的差异?为什么这种区别很重要?

在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响?

或者是根本,以“固定边界”的类型系统(NothingNull来我的心)?

爪哇

在Java中还可以识别出上面提到的几点注意事项/差异/问题?


(有关语言的介绍,请参见Type和Class有什么区别?

詹姆斯·艾瑞(James Iry):

当您说“类型”时,我将假设您主要是指静态类型。但是我将在短期内讨论动态类型。

静态类型是可以被静态证明的程序一部分的属性(静态表示“不运行它”)。在静态类型语言中,无论您是否编写,每个表达式都具有一种类型。例如,在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala的案例类和类之间有什么区别?

Scala Future和Java Future之间有什么区别

C结构和Java类之间有什么区别?

Java的BufferedReader和InputStreamReader类之间有什么区别?

Intellij-idea中的scala类,脚本和工作表之间有什么区别?

C ++或Java中的类型转换和类型转换之间有什么区别?

C ++和Java中的“泛型”类型之间有什么区别?

Java 8中抽象类和接口之间有什么区别?

Java中的类导入和包导入之间有什么区别?

Java API中的“ Class”类和“ class”关键字之间有什么区别?

Java 8 及更高版本中的抽象类和接口之间有什么区别?

java中this和this()之间有什么区别

Java中的Object和Object之间有什么区别

Java泛型类型中的<>和<?>有什么区别?

Java中的Array和Arrays类有什么区别?

类型注释和类型推断之间有什么区别?

类型安全和类型推断之间有什么区别?

类包装器和Java和Objective-C中的单例之间有什么区别?

.NET Core和.NET标准类库项目类型之间有什么区别?

在类设置器中使用强制转换和类型验证之间有什么区别?

之间有什么区别?和T在类和方法签名中?

Java中的&和&&有什么区别?

!=和=!有什么区别?在Java中?

LibGDX声音和音乐类型之间有什么区别?

类型“ string”和“ func()string”之间有什么区别?

stripi内容类型和组件之间有什么区别?

Scala中Stream中的“类”和“案例类”有什么区别?

ViewModelProviders和ViewModelProvider类之间有什么区别?

tkinter的Tk和Toplevel类之间有什么区别?