当前位置: 首页 > 面试题库 >

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

扈德容
2023-03-14
问题内容

斯卡拉

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

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

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

爪哇

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

(有关语言的介绍,请参见类型和类之间的区别?。)


问题答案:

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

静态类型是可以被静态证明的程序一部分的属性(静态表示“不运行它”)。在静态类型语言中,无论您是否编写,每个表达式都具有一种类型。例如,在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这样的类型,它们没有甚至没有任何值,更不用说一个类了。



 类似资料:
  • 问题内容: Java具有泛型,而通过提供了非常强大的编程模型。那么,和Java泛型之间有什么区别? 问题答案: 它们之间有很大的区别。在C ++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,而不必担心键入错误。 上面的方法添加了两个相同类型的对象,并且可以用于具有“ +”运算符的任何类型T。 在Java中,如果要在传递的对象上调用方法,则必须指定一种类型,例如: 在C

  • 问题内容: 这是过去的考试问题,我想知道什么是原始类型和引用类型?对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型是仅使用int或字符串创建数组的类型。(对?) 您认为您会如何回答测试中的问题并获得良好的信誉?如果没有真正直接引用原始的ARRAY类型,有没有办法做到这一点?还是您只用数组解释一下就可以了。 问题答案: 这些是Java中的原始类型: boolean byte short

  • 问题内容: 它们有何不同?我有点困惑,因为它们似乎是相似的概念。 了解它们如何帮助优化编译时间? 问题答案: 从Swift自己的文档中: 类型安全 Swift是一种类型安全的语言。类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个String,则不能错误地将其传递给Int。 类型推断 如果您 未 指定所需的值类型,则Swift会使用类型推断来得出适当的类型。通过类型推断,编

  • 问题内容: 您能否帮助您理解本机int类型与numpy.int32或numpy.int64类型之间的主要区别(如果有)? 问题答案: 观察差异的另一种方法是询问两种对象有什么方法。 在Ipython中,我可以使用tab complete来查看方法: 方法和属性: “经营者” 方法和属性(或属性)。一些相同,但更多的是,基本上所有的: 该方法看起来很像的。他们可以做同样的数学。 在很多方面与0d数组

  • 问题内容: C ++或Java中的类型转换和类型转换之间有什么区别? 问题答案: 类型 转换 将变量引用的值(内存块)视为与声明该变量的类型不同的类型。 类型 转换 实际上是在对该值进行转换。 在许多语言中, 某些 强制转换(通常是数字强制转换)的确会导致转换(这会因语言而异),但大多数情况下只是“将X当作Y处理”。 像人类语言的大多数方面一样,不幸的是,这些术语在不同社区中的使用略有不同,主要是

  • 问题内容: Java 和类之间有什么区别? 问题答案: BufferedReader是“ InputStreamReader / FileReader”的包装,它在每次调用本机I / O时都缓冲信息。 您可以想象在读取一个字符(或字节)与读取一个大号时的效率差异。一圈(或字节)中的字符数。使用BufferedReader,如果您希望读取单个字符,它将存储内容以填充其缓冲区(如果为空),并且对于进一