Gal*_*etz 5 types scala strong-typing
Scala是否强类型?您是否有示例如何在语言类型系统中反映出来?Scala是否允许类型惩罚?它是否允许强制?
Scala是否有ML这样的多型?
谢谢!
由于强类型,它不允许"打字",因为我知道它在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特征放弃静态类型系统.或者你可能会使用宏来实现你自己的惩罚.
不知道,不是ML专家.但是如果polytype只是意味着这个,那么这看起来像普通的高级(参数化)类型或"泛型",答案是肯定的.
def identity[A](x: A): A = xtrait Option[+A] { def get: A }