Scala是否强类型?

Gal*_*etz 5 types scala strong-typing

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

  2. Scala是否有ML这样的多型?

谢谢!

0__*_*0__ 5

  1. 是的.

由于强类型,它不允许"打字",因为我知道它在C语言中使用.但是,您有子类型,因此您可以安全地使用类型的值,A其中B请求类型的值,if A <: B(A是子类型或更具体的类型B).

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

另一个例外是结构类型,可以被认为是"双关语",虽然类型安全:

// 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
Run Code Online (Sandbox Code Playgroud)

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

您也可以使用特殊Dynamic特征放弃静态类型系统.或者你可能会使用宏来实现你自己的惩罚.

  1. 不知道,不是ML专家.但是如果polytype只是意味着这个,那么这看起来像普通的高级(参数化)类型或"泛型",答案是肯定的.

    • 示例:身份功能: def identity[A](x: A): A = x
    • 示例:单一类型参数: trait Option[+A] { def get: A }