Scala 它是什么意思';列表(1,2,3)和#x27;在斯卡拉?
我是Scala的新手,我有一个问题——我读了很多文章和书中的一些部分,但我不明白为什么我可以用Scala 它是什么意思';列表(1,2,3)和#x27;在斯卡拉?,scala,Scala,我是Scala的新手,我有一个问题——我读了很多文章和书中的一些部分,但我不明白为什么我可以用 val list = List(1, 2, 3) 当我尝试创建新列表时 val list = new List(1, 2, 3) 我得到以下错误 class List is abstract; cannot be instantiated i、 List是一个抽象类,但为什么我只能用params创建它呢 我理解以下代码: class SomeClass object SomeClass {
val list = List(1, 2, 3)
当我尝试创建新列表时
val list = new List(1, 2, 3)
我得到以下错误
class List is abstract; cannot be instantiated
i、 List是一个抽象类,但为什么我只能用params创建它呢
我理解以下代码:
class SomeClass
object SomeClass {
def factory() = new SomeClass()
}
object Main extends App {
val first = new SomeClass()
val second = SomeClass.factory()
}
i、 我可以用'new'关键字或工厂方法创建一个新的SomeClass对象,但是我如何既不使用'new'关键字也不使用工厂方法创建一个新的SomeClass对象呢 List有一个包含apply方法的伴生对象。在执行List(1,2,3)时,实际上是在调用List对象中的apply方法。apply方法创建默认列表实现的新实例,这可能有助于说明@AssafMendelson的答案:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class AFoo(id: Int) {}
class Foo(id: Int) extends AFoo(id) {}
object AFoo {
def apply(id: Int): AFoo = new Foo(id)
}
// Exiting paste mode, now interpreting.
defined class AFoo
defined class Foo
defined object AFoo
scala> val foo = new AFoo(3)
<console>:13: error: class AFoo is abstract; cannot be instantiated
val foo = new AFoo(3)
^
scala> val foo = AFoo(3)
foo: Foo = Foo@2e349cf2
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
抽象类AFoo(id:Int){}
类Foo(id:Int)扩展了AFoo(id){}
对象AFoo{
def应用(id:Int):AFoo=新的Foo(id)
}
//正在退出粘贴模式,现在正在解释。
定义类AFoo
定义类Foo
定义对象AFoo
scala>val foo=新AFoo(3)
:13:错误:类AFoo是抽象的;无法实例化
val foo=新AFoo(3)
^
scala>val foo=AFoo(3)
foo:foo=Foo@2e349cf2
在上面的示例中,
AFoo
是一个带有伴生对象的抽象类(也称为AFoo
)。伴随对象有一个apply
方法,该方法创建一个Foo
,它是AFoo
的一个实现。因此,虽然您不能直接用new AFoo(3)
实例化AFoo
,因为它是抽象的,但您可以调用AFoo(3)
来调用伴生对象的apply
方法并创建Foo
实例。List[t]
是Scala中的一个抽象类
调用List()
时,您没有调用类List
的构造函数方法。相反,您正在调用List
对象的apply()
因此List()
与newlist()
不同,它是List
类的语法糖,而是List.apply(seq:T*)
的语法糖,其中List
是伴生对象,seq
是T
类型的对象序列。本例中的apply
方法只调用seq.toList()
List
类是抽象的,有两个子类-(也称为cons)和Nil
(实际上是一个对象)Nil
是一个空列表,:
是一个具有两个值的对象—头或第一个元素,尾或其余元素的列表。如果需要,可以调用:
构造函数,例如new:(1,new:(2,new:(3,Nil))
。顺便说一句,这与编写1::2::3::Nil
的结果相同,后者反过来又是::(1,::(2,::(3,Nil))
的语法糖,其中,您再次调用:
的apply
方法
列表
类是抽象的,其背后有几个设计原因。例如,了解它的实际工作原理(cons和Nil
)对于模式匹配列表非常有用。如果没有名为foo
的方法在作用域中具有正确的类型,并且有名为apply
的方法在foo
中定义了正确的类型,那么
foo(bar, baz)
语法上的糖是什么
foo.apply(bar, baz)
List.apply(1, 2, 3)
(这允许您编写自己的“类似函数”的对象。)
所以
语法上的糖是什么
foo.apply(bar, baz)
List.apply(1, 2, 3)
和
我可以用“new”关键字或工厂方法创建一个新的SomeClass对象,但是如何既不使用“new”关键字也不使用工厂方法创建一个新的SomeClass对象呢
List.apply
是工厂方法。严格来说,1::2::3::Nil
是Nil::(3)。:(2)。:(1)
而不是:(1,::(2,:(3,Nil))