Scala是否强类型?

时间:2015-06-01 13:01:24

标签: scala types strong-typing

  1. Scala是否强类型?您是否有示例如何在语言类型系统中反映出来? Scala是否允许类型惩罚?它是否允许强制?

  2. Scala是否具有ML等多种类型?

  3. 谢谢!

1 个答案:

答案 0 :(得分:5)

  1. 即可。
  2. 由于强类型,它不允许&#34;类型惩罚&#34;据我所知,它用于C语言。但是,您有子类型,因此如果AB是子类,则可以安全地使用类型为A <: B的{​​{1}}类型的值 - 类型或更具体的A)。

    您可以使用B强制转换类型,但是如果a.asInstanceOf[B]不是a的子类型,则会在运行时对其进行类型检查并导致异常抛出,除了在JVM上擦除的高级类型之外,这意味着只有在引用类型参数的实际值时才会抛出此类异常。

    另一个例外是结构类型可以被认为是&#34; punning&#34;,虽然类型安全:

    B

    这被认为是一种很少使用的高级功能,在将来的Scala版本中甚至可能会被弃用。它需要运行时反射,因此会带来性能损失。

    您也可以使用特殊Dynamic trait放弃静态类型系统。或者你可以做一些疯狂的事情using macros来实现你自己的惩罚。

    1. 不知道,不是ML专家。但是如果polytype只意味着this,那么这看起来就像普通的高级(参数化)类型或&#34;泛型&#34;,答案是

      • 示例:身份功能:// ordinary type trait Foo { def bar: Int } // structural type type Bar = Any { def bar: Int } def test(b: Bar) = b.bar test(new Foo { val bar = 1234 }) // allowed
      • 示例:单一类型参数:def identity[A](x: A): A = x