问题标签 [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 投票
1 回答
937 浏览

scala - 当类型类不在专用源文件中时,为什么 Scala 找不到我在伴随对象中隐式定义的类型类实例?

请参考下面的源代码。所有源代码都定义在同一个包中。当我在单个源文件中定义所有代码ShowMain.scala时,我得到一个编译错误,但是当object ShowMainShowMain.scalatrait Showobject Show定义时Show.scala,没有编译错误。

我的问题: 这是什么原因?我违反了什么语言规则?

示例代码:

编译错误:

(ScalaIDE/Scala 2.11.2 在线包含output("hello")

0 投票
1 回答
207 浏览

scala - 伴随对象的 Scala 隐式逻辑

上面的代码无法编译,因为编译器无法找到 Prefixer 的隐式值。但是,如果我将案例类 Prefixer 和伴随对象放在另一个文件中,它就可以工作。这是为什么?

0 投票
1 回答
445 浏览

scala - Create companion objects for classes imported from Java

I want to create companion objects for some imported Java types, so that I do not have to use new to allocate them. I want to start with the type Vector3f is imported from com.jme3.math from jMonkeyEngine.

What I tried is:

When compiling this, I get errors:

Error:(8, 21) not found: type Vector3f def apply() = new Vector3f()

When I add import com.jme3.math.Vector3f, I get warning which probably explains what I see:

Warning:(3, 22) imported `Vector3f' is permanently hidden by definition of object Vector3f in package math

How can I create a companion object for com.jme3.math.Vector3f or other types imported from Java?

0 投票
3 回答
3980 浏览

scala - 带有案例类的 Scala 工厂设计模式

我正在尝试使用伴随对象上可用的应用方法在 Scala 中实现工厂设计模式。我有以下方法。

TypeA在创建or的实例时,我现在如何强制上述特征的调用者通过伴随对象TypeB

0 投票
1 回答
77 浏览

scala - 访问scala中伴随对象内的对象

我有以下内容:

如果我尝试访问City(从另一个源文件),我会收到一条错误消息,例如

我可以想到一些变通办法,但我想知道是否有办法让我的名字保持不变,即我想City通过键入来访问Location.City

编辑:

我正在像这样访问它:

0 投票
1 回答
374 浏览

scala - 在 Scala 的伴生对象的 apply 方法中实例化类的子类型

我一直在尝试使用伴生对象来实例化一个类的子类型。在编译时不知道将实例化哪个子类。这与从第 127 页开始的Programming Scala中的示例非常相似。我在这里设计了一个示例:

这个程序打印出来scala.Option[Animal]。我希望它打印出来scala.Option[Dog]。此外,如果我尝试将该行添加println(dog.bark)到对象的末尾Test,则无法编译。这根本不可能吗?

我一直在研究 Scala 反射文档,但它似乎非常密集和困难。此外,这似乎正是Programming Scala示例的工作原理,所以我无法想象我在这里做错了什么。


编辑:这个版本没有反射,只是由于类型错误而引发编译时错误。


编辑:显然这需要模式匹配才能解决。这是一个工作示例,有些简化。

0 投票
2 回答
89 浏览

scala - 如何保证伴生对象中存在方法并引用它?

考虑这个示例,其中Listable旨在混合到案例类的伴随对象中。因此,为了调用Writer.grid,必须有一个A扩展的伴生对象Listable[A],并在其中implicit Writer[A]定义。(例如,将任意列表转换为ListableCSV 格式。)

这是一个天真的实现:

这可以编译,但不能工作,因为listable: A真正指的是 object Test,而Ainw: Writer[A]指的是 case class Test,所以调用Writer.grid(Test)不符合类型边界。

Listable我可以通过放弃并要求implicit List[A]签名来解决这个问题grid

但我更愿意:

  1. 不需要这样一个可能产生意外结果的隐式函数。
  2. 不要使用特殊类型来 wrap list,因为它也会在其他地方使用。
  3. grid将方法的定义保留Listable.

是否可以重新签名Writer.grid以使其工作?(或其他结构变化)

0 投票
1 回答
406 浏览

java - 静态内部类 vs Companion 的内部类

阅读 Ordesky 关于 Scala 的书的第 20 章,我发现内部类是路径依赖的。在其他特性中,这意味着它们只能在外部类中实例化或提供外部类实例。

问题出现了:我想static inner class在 Scala 中实现一个,但作者认为这是不可能的。我立即想到让“内部类”(让我们称之为Inner)成为Outer的伴随对象的成员。

这个问题的公认答案似乎指向了这个方向。但这会导致一个问题:Inner's type ins't Outer#Inner,我可以尝试类似:

然而,这不起作用。你知道这方面的工作吗?我有预感它可以用抽象类型来完成,但我不确定。

请注意,由于其类型,创建Inner伴随对象的内部类并不完全等同于具有非路径依赖Inner类。

0 投票
2 回答
277 浏览

scala - 我可以在 Scala 中声明它的伴生对象中的类吗?

在与我的私有不可变类构造函数以及辅助构造函数必须相互调用作为第一条语句的约束进行斗争时,在范围内没有任何其他类的情况下,我似乎被限制为我的实例化使用伴随对象,并且由于我的伴随对象必须访问主构造函数,我需要 private 关键字来定位包括该对象的范围。

现在,我的大脑在名称生成方面很薄弱,我试图通过将我的类放在伴随对象本身中来节省对伴随对象和类的封闭命名空间的需要,这样:

问题是Groupofprivate[Group]不引用对象,但仍然是类(使其多余)。

如何将该构造函数标记为在伴随对象级别可用,但不能在其外部使用?

PS:那个伴生对象已经让我头疼了,我什至宁愿只拥有这个类,在那里限定complexCompute,几个构造函数实现可能需要......

编辑:好的。就在添加标签时,我碰到了一个响铃的神经元,一个伴生对象可能对类的范围有一些特权。它可以访问其私有部分,因此我可以简单地将对象和类并排放置,而无需专门的封闭范围。但是,我坚持这个问题,既是对处理此类装箱案例范围界定的可能性方式的回应,也是对object Main {object Main {object Main...在类中只有构造函数而没有任何伴随对象的技术发表评论的机会。

0 投票
2 回答
106 浏览

scala - 特征能否保证它在编译或运行时被伴生对象继承

我有一个特征,它的初始化本质上不是线程安全的,而是严格用作伴生对象的基础,根据定义,初始化线程安全的。

是否有某种方法可以保证(在编译时或运行时)该特征始终由伴随对象扩展?该特征有一个方法,该方法始终且仅在伴随对象初始化期间调用,该方法可能是验证的站点。