问题标签 [companion-object]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oop - 在 Scala 中拥有伴生对象的基本原理是什么?
是否存在需要类的伴随对象(单例)的情况?为什么我要创建一个类,比如说Foo
并为它创建一个伴生对象?
scala - Scala 的 apply() 方法是如何工作的?
在 Scala 中,如果我定义了apply
在类或顶级对象中调用的方法,则只要我将一对括号附加到该类的实例并将适当的参数apply()
放在它们之间,就会调用该方法。例如:
所以基本上,object(args)
只是object.apply(args)
.
Scala 如何进行这种转换?
这里是否有全局定义的隐式转换,类似于 Predef 对象中的隐式类型转换(但种类不同)?还是有更深层次的魔法?我之所以这么问,是因为 Scala 似乎强烈倾向于一致地应用一组较小的规则,而不是包含许多例外的许多规则。这最初对我来说似乎是一个例外。
scala - Scala 类型别名,包括伴随对象 [初学者]
我想写一个类型别名来缩短、漂亮和封装的 Scala 代码。假设我有一些集合,它具有映射列表的属性,其值是元组。我的类型会写一些类似的东西List[Map[Int, (String, String)]]
,或者我的应用程序允许的任何更通用的东西。我可以想象有一个超类型要求一个Seq[MapLike[Int, Any]]
或任何漂浮在我的船上的东西,具体的子类更具体。
然后我想为这种长类型写一个别名。
然后,我会很高兴地ConcreteClass#DataType
在任何我能拿走的地方使用它,并使用它。
现在假设我添加一个函数
我想用一个空列表从外面调用它。我可以调用foo(List())
,但是当我想将我的基础类型更改为另一种类型时Seq
,我也必须回来更改此代码。此外,这个空列表的目的不是很明确DataType
。并且伴生对象没有关联的List
方法,所以不能调用DataType()
, 或DataType.empty
. 当我需要非空列表时会更加烦人,因为我必须写出这种长类型的重要部分。
有什么方法可以让 Scala 将我的类型理解为相同的东西,包括伴随对象及其创建者方法,以缩短代码并将其黑盒化?或者,我为什么不应该首先这样做?
scala - 在 Scala 中,如何为 Java 中定义的类定义伴随对象?
我想向建模工具生成的 Java 类添加隐式转换。所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们。但我不能将它们添加到单独的文件中,因为必须在同一个文件中定义伴侣。对此我能做些什么吗?
当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入。还有其他解决方案吗?
scala - 伴侣对象无法访问类上的私有变量
来自 Scala REPL 的一个相当奇怪的行为。
尽管以下编译没有问题:
私有变量似乎无法从 REPL 中的伴随对象访问:
为什么会这样?
scala - 将伴随对象应用于别名类型
我想让我的 Scala 代码更具可读性,所以我为所有参数化类型添加了自定义类型。
所以我有包装对象,为简单起见,
但是,现在我不能apply
对伴生对象做简单的事情。来自 REPL:
该怎么办?
(只是为了确保:我的实际别名对象比 更复杂Seq[Int]
)
编辑:有一个类似的问题 - Scala 类型别名,包括伴随对象 [beginner]
关于那个问题,有两个回复,他们都没有工作。
一种是使用 apply 定义我的自定义对象,但我不确定在我的情况下如何做到这一点,而且它有点冗长。
另一个 - 写入val IntSeq = Seq
会产生错误
警告:先前定义的特征 Seq 不是值 IntSeq 的伴侣。必须一起定义同伴;您可能希望为此使用 :paste 模式。
oop - 具有伴随对象的类与具有相同名称的类和对象之间有什么区别?
Scala 类的“伴生对象”可以被视为具有与类相同的完全限定名称的单例对象(即同名,在同一个包中)。它们用于保存类的所有实例共有的实用函数,作为 Javastatic
方法的替代品。
但是,在文档和问题的各个地方,它都说必须在同一个编译单元中定义伴随对象。例如,它们必须在同一个文件中定义;不能为 Java 对象定义伴生对象;在 REPL 中,它们必须在同一输入行上定义,因此会出现警告消息:
这意味着在类及其伴生对象之间必须有区别,而只是具有相同(完全限定)名称的类和对象。这个区别是什么?
scala - 编译器忽略了Scala工厂?
我花了所有时间在我的伴生对象中组合一个工厂方法,如下所示:
但是当我以为我要杀了它时,我就去编译了,但这不起作用:
到底是怎么回事!?我刚做了这个!?帮助!!!
scala - 在 Scala 中键入伴随对象
我有一个类及其伴生对象,它们一起具有一些可重用的功能。我已经将伴生对象的功能封装成一个特征,所以现在的情况是这样的
由于Foo.foo
是一种可重用的方法,我想把它放到它的 trait 中。
但是我必须找到一种方法来告诉类型检查器,虽然bar
它不是 class 上的方法Foo
,但它会在范围内,因为它是从伴随对象导入的。我想我需要一些东西,比如能够在类的伴随对象上打字。
有没有类似的东西?