Scala - 类就足够了吗?

标签 scala class

来自 Java,我对 scala 的类/对象区别感到困惑。
请注意,我不要求形式上的区别;有足够的
网络上的引用资料解释了这一点,并且有相关的问题
SO .

我的问题是:

  • 为什么scala的设计者
    选择让事情变得更多
    复杂(与 Java 或
    C#)?我有什么缺点
    期待我是否忽略这种区别
    并只声明类?

  • 谢谢。

    最佳答案

    Java 类包含两种完全不同类型的成员——实例成员(如 BigDecimal.plus)和静态成员(如 BigDecimal.valueOf)。在 Scala 中,有 仅限 实例成员。这实际上是一种简化!但这留下了一个问题:我们将 valueOf 之类的方法放在哪里? ?这就是对象有用的地方。

    class BigDecimal(value: String) {
       def plus(that: BigDecimal): BigDecimal = // ...
    }
    
    object BigDecimal {
       def valueOf(i: Int): BigDecimal = // ...
    }
    

    您可以将其视为匿名类的声明及其单个实例化:
    class BigDecimal$object {
       def valueOf(i: Int): BigDecimal = // ...
    }
    lazy val BigDecimal = new BigDecimal$object
    

    在阅读 Scala 代码时,区分类型和值至关重要。我已将 IntelliJ 配置为突出显示蓝色类型。
    val ls = List.empty[Int]  // List is a value, a reference the the object List
    ls: List[Int]             // List is a type, a reference to class List
    

    Java 还具有在 Scala 中消除的另一种复杂程度——字段和方法之间的区别。接口(interface)上不允许有字段,除非它们是静态的和最终的;方法可以被覆盖,如果在子类中重新定义,字段会被隐藏。 Scala 消除了这种复杂性,只向程序员公开方法。

    最后,对你的第二个问题的一个 glib 答案:如果你不声明任何对象,你的程序可能永远不会运行,因为你定义了 public static void main(String... args) {} 的等价物在 Scala 中,您至少需要一个对象!

    关于Scala - 类就足够了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128217/

    相关文章:

    scala - 插入排序在我用 Scala 编写的代码中不起作用

    scala - 在 HashSet 中使用替代比较

    scala - 如何在 sbt 中将 baseDirectory 转换为字符串?

    json - 使用 spark 和 Scala 读取文本文件中的 JSON

    c++ - 如何使客户端无法访问命名空间的函数

    Java:创建对象实例时带括号的类名

    PHP 类 - 全局或 __construct

    java - 对于一个完整的 Scala 新手来说,基于 Scala 的框架如何堆叠起来——Lift、Play、Circumflex 等

    java - 如何解决 ClassNotFoundException?

    python:类与元组巨大的内存开销(?)