问题标签 [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.

0 投票
7 回答
36566 浏览

oop - 在 Scala 中拥有伴生对象的基本原理是什么?

是否存在需要类的伴随对象(单例)的情况?为什么我要创建一个类,比如说Foo并为它创建一个伴生对象?

0 投票
3 回答
31384 浏览

scala - Scala 的 apply() 方法是如何工作的?

在 Scala 中,如果我定义了apply在类或顶级对象中调用的方法,则只要我将一对括号附加到该类的实例并将适当的参数apply()放在它们之间,就会调用该方法。例如:

所以基本上,object(args)只是object.apply(args).

Scala 如何进行这种转换?

这里是否有全局定义的隐式转换,类似于 Predef 对象中的隐式类型转换(但种类不同)?还是有更深层次的魔法?我之所以这么问,是因为 Scala 似乎强烈倾向于一致地应用一组较小的规则,而不是包含许多例外的许多规则。这最初对我来说似乎是一个例外。

0 投票
4 回答
3307 浏览

scala - 为什么案例类伴随对象扩展 FunctionN?

当您创建一个案例类时,编译器会创建一个相应的伴随对象,其中包含一些案例类的好东西:一个apply与主构造函数匹配的工厂方法equals、、、hashCodecopy

有点奇怪,这个生成的对象扩展了 FunctionN。

只有在以下情况下才会出现这种情况:

  • 没有手动定义的伴随对象
  • 只有一个参数列表
  • 没有类型参数
  • 案例类不是抽象的。

好像是两年前添加的。最新的化身就在这里

有没有人使用它,或者知道为什么添加它?它使用静态转发器方法稍微增加了生成的字节码的大小,并显示在#toString()伴随对象的方法中:

更新

使用单一apply方法手动创建的对象不会自动被视为FunctionN

0 投票
2 回答
3207 浏览

scala - Scala 类型别名,包括伴随对象 [初学者]

我想写一个类型别名来缩短、漂亮和封装的 Scala 代码。假设我有一些集合,它具有映射列表的属性,其值是元组。我的类型会写一些类似的东西List[Map[Int, (String, String)]],或者我的应用程序允许的任何更通用的东西。我可以想象有一个超类型要求一个Seq[MapLike[Int, Any]]或任何漂浮在我的船上的东西,具体的子类更具体。

然后我想为这种长类型写一个别名。

然后,我会很高兴地ConcreteClass#DataType在任何我能拿走的地方使用它,并使用它。

现在假设我添加一个函数

我想用一个空列表从外面调用它。我可以调用foo(List()),但是当我想将我的基础类型更改为另一种类型时Seq,我也必须回来更改此代码。此外,这个空列表的目的不是很明确DataType。并且伴生对象没有关联的List方法,所以不能调用DataType(), 或DataType.empty. 当我需要非空列表时会更加烦人,因为我必须写出这种长类型的重要部分。

有什么方法可以让 Scala 将我的类型理解为相同的东西,包括伴随对象及其创建者方法,以缩短代码并将其黑盒化?或者,我为什么不应该首先这样做?

0 投票
2 回答
2463 浏览

scala - 在 Scala 中,如何为 Java 中定义的类定义伴随对象?

我想向建模工具生成的 Java 类添加隐式转换。所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们。但我不能将它们添加到单独的文件中,因为必须在同一个文件中定义伴侣。对此我能做些什么吗?

当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入。还有其他解决方案吗?

0 投票
2 回答
3517 浏览

scala - 伴侣对象无法访问类上的私有变量

来自 Scala REPL 的一个相当奇怪的行为。

尽管以下编译没有问题:

私有变量似乎无法从 REPL 中的伴随对象访问:

为什么会这样?

0 投票
1 回答
853 浏览

scala - 将伴随对象应用于别名类型

我想让我的 Scala 代码更具可读性,所以我为所有参数化类型添加了自定义类型。

所以我有包装对象,为简单起见,

但是,现在我不能apply对伴生对象做简单的事情。来自 REPL:

该怎么办?

(只是为了确保:我的实际别名对象比 更复杂Seq[Int]

编辑:有一个类似的问题 - Scala 类型别名,包括伴随对象 [beginner]

关于那个问题,有两个回复,他们都没有工作。

一种是使用 apply 定义我的自定义对象,但我不确定在我的情况下如何做到这一点,而且它有点冗长。

另一个 - 写入val IntSeq = Seq会产生错误

警告:先前定义的特征 Seq 不是值 IntSeq 的伴侣。必须一起定义同伴;您可能希望为此使用 :paste 模式。

0 投票
1 回答
3879 浏览

oop - 具有伴随对象的类与具有相同名称的类和对象之间有什么区别?

Scala 类的“伴生对象”可以被视为具有与类相同的完全限定名称的单例对象(即同名,在同一个包中)。它们用于保存类的所有实例共有的实用函数,作为 Javastatic方法的替代品。

但是,在文档和问题的各个地方,它都说必须在同一个编译单元中定义伴随对象。例如,它们必须在同一个文件中定义;不能为 Java 对象定义伴生对象在 REPL 中,它们必须在同一输入行上定义,因此会出现警告消息:

这意味着在类及其伴生对象之间必须有区别,而只是具有相同(完全限定)名称的类和对象。这个区别是什么?

0 投票
1 回答
89 浏览

scala - 编译器忽略了Scala工厂?

我花了所有时间在我的伴生对象中组合一个工厂方法,如下所示:

但是当我以为我要杀了它时,我就去编译了,但这不起作用:

到底是怎么回事!?我刚做了这个!?帮助!!!

0 投票
2 回答
1198 浏览

scala - 在 Scala 中键入伴随对象

我有一个类及其伴生对象,它们一起具有一些可重用的功能。我已经将伴生对象的功能封装成一个特征,所以现在的情况是这样的

由于Foo.foo是一种可重用的方法,我想把它放到它的 trait 中。

但是我必须找到一种方法来告诉类型检查器,虽然bar它不是 class 上的方法Foo,但它会在范围内,因为它是从伴随对象导入的。我想我需要一些东西,比如能够在类的伴随对象上打字。

有没有类似的东西?