【问题标题】:Is Scala strongly typed ? [closed]Scala 是强类型的吗? [关闭]
【发布时间】:2015-06-01 13:01:24
【问题描述】:
  1. Scala 是强类型的吗?你有例子它是如何反映在语言类型系统中的吗? Scala 是否允许类型双关语?它允许强制吗?

  2. Scala 有像 ML 这样的多型吗?

谢谢!

【问题讨论】:

  • 你最终会在这里陷入黄蜂巢,因为 weakstrong 类型的定义不是很明确 (says Wikipedia) ;)
  • 在您给出“强类型”的准确定义之前,无法回答这个问题。

标签: scala types strong-typing


【解决方案1】:
  1. 是的

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

您可以使用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. 不知道,不是机器学习专家。但如果 polytype 仅表示 this,那么这看起来就像普通的高级(参数化)类型或“泛型”,答案将是 Yes

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

【讨论】:

  • 但是"1.0" + 5scala5 转换为字符串,结果是"1.05"。 Scala 在这里表现得像一种弱类型语言。
  • 一个更好的检查方法是应用1 == "1",它将为强类型语言返回false,它不会强制执行
猜你喜欢
  • 2012-07-04
  • 2021-11-06
  • 2011-07-19
  • 2015-03-23
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多