2015-06-01 225 views
4
  1. 是斯卡拉强类型?你有没有例子,它是如何反映在语言类型系统? Scala允许类型双关吗?它允许强制吗?是斯卡拉强类型?

  2. 斯卡拉有像ML这样的多型吗?

谢谢!

+3

你会在一个马蜂窝在这里结束了,因为*弱*或*强*打字([维基百科说]](https://en.wikipedia.org/wiki/Strong_and_weak_typing);) – Carsten

+1

这个问题不能回答,直到你给出“强类型”的确切定义。 –

回答

5

由于强类型,它不允许“类型双关”,因为我知道它是在C语言中使用。但是,如果A <: BAB的子类型或更具体),则可以安全地使用A类型的值,其中请求B类型的值。

您可以强制使用a.asInstanceOf[B],但是这将是类型检查在运行时类型和导致异常,如果a是没有一分型B被抛出,与更高kinded类型除外,它被删除在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 

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

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

  1. 不知道,不是ML专家。但是,如果多类型意味着this,那么这看起来像普通的高级(参数化)类型或“泛型”,并且答案将是

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

但是''1.0“+ 5','scala'如何将'5'转换为字符串,结果是'”1.05“'。 Scala在这里表现得像一个弱类型的语言。 – Akavall