Scala是否强类型?您是否有示例如何在语言类型系统中反映出来? Scala是否允许类型惩罚?它是否允许强制?
Scala是否具有ML等多种类型?
谢谢!
答案 0 :(得分:5)
由于强类型,它不允许"类型惩罚"据我所知,它用于C语言。但是,您有子类型,因此如果A
(B
是子类,则可以安全地使用类型为A <: B
的{{1}}类型的值 - 类型或更具体的A
)。
您可以使用B
强制转换类型,但是如果a.asInstanceOf[B]
不是a
的子类型,则会在运行时对其进行类型检查并导致异常抛出,除了在JVM上擦除的高级类型之外,这意味着只有在引用类型参数的实际值时才会抛出此类异常。
另一个例外是结构类型可以被认为是&#34; punning&#34;,虽然类型安全:
B
这被认为是一种很少使用的高级功能,在将来的Scala版本中甚至可能会被弃用。它需要运行时反射,因此会带来性能损失。
您也可以使用特殊Dynamic
trait放弃静态类型系统。或者你可以做一些疯狂的事情using macros来实现你自己的惩罚。
不知道,不是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