Scala抽象类实例

时间:2018-06-24 15:35:32

标签: scala abstract-class

我是Scala的新手。我对 List 类有疑问。这是一个抽象的密封类。这意味着无法实例化,也不能扩展。那么它的用途是什么?像以下这样的东西怎么会起作用?

Top Fade

myList是否将引用List对象作为对象? 另外,如果 productElement 是抽象方法,那么如何实现?

谢谢。

2 个答案:

答案 0 :(得分:3)

sealed表示无法将其扩展到定义它的文件之外。列表是sealed,但确实在同一文件中定义了2个非抽象子类:Nil::分别代表一个空列表和一个非空列表。

调用List(1,2,3)时并没有真正实例化List类。这是List.apply(1, 2, 3)的语法糖,它正在apply对象(与List类一起)上调用List方法。并且该方法(从技术上说是通过某种间接方式)最终生成Nil::的实例。

您可以在此处查看列表子类: https://github.com/scala/scala/blob/2.13.x/src/library/scala/collection/immutable/List.scala#L547 https://github.com/scala/scala/blob/2.13.x/src/library/scala/collection/immutable/List.scala#L554

您不需要实现它,它是由scala编译器为所有case类创建的。{p>

答案 1 :(得分:2)

关于:

const fruits = [
  { name: 'apple', count: 2 },
  { name: 'apple', count: 4 },
  { name: 'banana', count: 5 },
  { name: 'apple', count: 3 },
  { name: 'apple', count: 4 },
  { name: 'apple', count: 1 },
  { name: 'banana', count: 3 },
  { name: 'apple', count: 1 },
  { name: 'orange', count: 2 }
];

function getReduced(total, {name,count}) {
    total[name] = total[name] || {name,count: 0};
    total[name].count += count;
    return total;
}

let fruitsReduces = Object.values(fruits.reduce(getReduced,{}));
console.log(fruitsReduces);

当编译器遇到一个表达式,该表达式创建了一个没有val myList = List(1,2,3) 修饰符的类实例时,它将查找该类的伴随对象以寻找new方法。对于列表,它定义为:

.apply

因此,此编译成功。您可以在要求编译器在typer阶段之后发出类型信息时查看以下内容:

override def apply[A](xs: A*): List[A] = xs.toList
  

myList是否将引用List对象作为对象?

def main(args: Array[String]): Unit = { val l: List[Int] = scala.collection.immutable.List.apply[Int](1, 2, 3); () } 的运行时类型可以是缺点(myList)或空白列表(::)。

  

如果productElement是抽象方法,那么如何实现?

这是一个编译器技巧。 NilproductElement(以及更多)都是在编译时针对任何case类定义生成的。例如,给定以下案例类:

productArity

编译器生成:

case class Bar(i: Int)