问题标签 [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 回答
530 浏览

scala - 带有伴随对象的 Scala 类型别名

我是一个相对较新的 Scala 用户,我想对我的代码的当前设计发表意见。

我有几个类都表示为固定长度的 Vector[Byte](最终它们用于需要字节字符串的学习算法),比如 A、B 和 C。我希望这些类被称为 A , B 和 C 为了便于阅读,我不需要在 Vector 中为这些方法添加任何额外的类方法。因此,我认为扩展我的库模式在这里没有用。但是,我想包含 Vector 附带的所有有用的函数方法,而不必每次都“钻取”到包装器对象中。由于效率在这里很重要,我也不希望增加包装纸的重量。

因此我决定在包对象中定义类型别名:

但是,每个都有自己的固定长度,我想包括工厂方法来创建它们。似乎这就是伴随对象的用途。这是我最终设计的样子:

一切都可以编译,它允许我做这样的事情:

我找不到任何特别警告不要为类型别名编写伴随对象的东西,但它似乎与应该如何使用类型别名背道而驰。这也意味着所有这三个类都定义在同一个文件中,理想情况下它们应该分开。

  1. 这种方法有什么隐藏的问题吗?
  2. 这个问题有更好的设计吗?

谢谢。

0 投票
1 回答
84 浏览

scala - 访问类型的伴随对象

我有某种类型的变量,我想从伴随对象中获取信息。例如,我认为我可以做这样的事情:

但这相当冗长,minVal并且:Long使与 的比较变得复杂i: I

我希望我能找到简洁直接的东西,但我怀疑这需要反思,而这通常都不是。

0 投票
1 回答
2322 浏览

scala - 错误的前向引用但 Scala 脚本运行良好

我正在使用 IntelliJ 的 Scala 插件的最新版本,并拥有以下代码,其目的是允许枚举 class 的实例Count

引用id()伴随对象的方法时,IntelliJ 给了我一个前向引用错误,但脚本编译完美,产生了输出Vector(Count0, Count1, Count2)。事实上,我只是在成功运行脚本后偶然注意到错误。是什么赋予了?

0 投票
1 回答
999 浏览

kotlin - kotlin,如何将扩展功能添加到已定义的类伴随对象

我想向已经定义的类的伴随对象添加一些扩展函数,比如

我也喜欢在接口上做同样的事情,例如

我查阅了文档,只是找到了为用户定义的类中的伴随对象定义扩展函数的语法,而不是没有伴随对象的类

我有机会在 kotlin 中做到这一点吗?

0 投票
3 回答
942 浏览

scala - 创建一个伴生对象,该对象混合一个特征,该特征定义了一个返回对象伴生类对象的方法

抽象问题:创建一个可以混合到类的伴随对象中的特征,为该对象提供一个返回该类对象的方法。

具体问题:我正在尝试创建一堆用于 RESTful 服务调用的类,它们知道如何对自己进行序列化和反序列化,如下所示:

预期的用法是这样的:

我正在使用Genson通过全局对象访问的序列化/反序列化:

然后我像这样定义特征:

这编译。但这不会:

我收到以下错误消息:

我尝试过创建一个特征,如下所示:

现在,如果我只是声明,case class Foo (...) extends JsonSerialization[Foo]那么我不能调用Foo.fromJson,因为只有类的实例Foo具有该方法,而不是伴随对象。

如果我声明object Foo extend JsonSerialization[Foo],那么我可以编译并Foo拥有一个.fromJson方法。但是在运行时,调用fromJson认为那T是 a JsonSerialization,而不是 a Foo,或者以下运行时错误表明:

我不能宣布object Foo extends Foo,因为我得到

所以我可以尝试添加构造函数参数,然后编译并运行,但是当它尝试反序列化时运行时类型再次错误,给我上面的错误。

我唯一能做的就是fromJson在每个伴随对象中定义。但是必须有一种方法可以在特征中定义它,并且只需混合该特征即可。正确的?

0 投票
1 回答
2922 浏览

scala - 伴随对象的继承

我正在尝试重构一些我目前看起来像这样的模型:

看起来像这样的东西:

这样我就可以做到这一点:


我希望每个模型都定义一个隐式读取值,但我不确定如何在抽象类的伴随对象中指出这一点。

0 投票
1 回答
263 浏览

scala - 伴随对象中的 Scala 隐式类型类优先级

编译此代码时,出现以下错误:

为什么implicit definSubtrait伴生对象的优先级不高于 in Supertrait

我希望implicit defsubtraits 的伴生对象中的 s 比 supertraits 中的优先级更高。

更新

这个LowPriorityImplicits技巧也不起作用。请参阅在 Scala 中的隐式实例中强制执行优先级

0 投票
1 回答
1885 浏览

scala - 访问基类的受保护成员

我不经常使用继承,所以我不确定为什么它不起作用。在我的项目中,我有以下内容:

具有受保护成员的基本密封类:

它是有一些逻辑的后代:

上面的编译给了我以下错误:

我不太确定从超类调用受保护的成员有什么问题......但是如果我们将它包装到伴生对象中会变得更有趣,它神奇地解决了问题:

0 投票
1 回答
235 浏览

scala - 如何弃用案例类的伴随对象?

我注意到如果一个案例类被弃用,它的伴生对象不是。

我想得到一个A(0)与我得到的完全一样的警告new A(0)。我应该明确定义伴随对象并弃用它吗?有没有更好的办法?

0 投票
3 回答
3809 浏览

static - Kotlin 对象 vs 伴生对象 vs 包作用域方法

我在 Kotlin 中编写了这个方法并分析了字节码:

情况一

情况2

情况 3

字节码结果

  • 情况1:班级Test$asbpublic final doSomething()I
  • 情况2:班级Test$Companionpublic final doSomething()I
  • 情况3:班级TestKtpublic final static doSomething()I

我的问题是:

  • 我有一个枚举类,我想返回一个给定枚举变量的枚举实例,例如 findById (enum(id, color))。我该怎么做?伴侣对象?目的?

  • 似乎拥有真正静态方法的唯一方法是在包级别,没有类声明。但这变得有点过于全球化了。有什么方法可以通过: 访问它ClassName.staticMethod, staticMethod 真的是静态的。

  • 提供包声明方法、伴生对象和对象的有意义的示例。

语境。我一直在使用 Kotlin 进行编码,我觉得它很棒。但有时我需要做出决定:例如,在 java 中我会声明为 static final 的重不可变属性,但在 Kotlin 中我发现很难“找到等价物”。