问题标签 [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.
scala - 带有伴随对象的 Scala 类型别名
我是一个相对较新的 Scala 用户,我想对我的代码的当前设计发表意见。
我有几个类都表示为固定长度的 Vector[Byte](最终它们用于需要字节字符串的学习算法),比如 A、B 和 C。我希望这些类被称为 A , B 和 C 为了便于阅读,我不需要在 Vector 中为这些方法添加任何额外的类方法。因此,我认为扩展我的库模式在这里没有用。但是,我想包含 Vector 附带的所有有用的函数方法,而不必每次都“钻取”到包装器对象中。由于效率在这里很重要,我也不希望增加包装纸的重量。
因此我决定在包对象中定义类型别名:
但是,每个都有自己的固定长度,我想包括工厂方法来创建它们。似乎这就是伴随对象的用途。这是我最终设计的样子:
一切都可以编译,它允许我做这样的事情:
我找不到任何特别警告不要为类型别名编写伴随对象的东西,但它似乎与应该如何使用类型别名背道而驰。这也意味着所有这三个类都定义在同一个文件中,理想情况下它们应该分开。
- 这种方法有什么隐藏的问题吗?
- 这个问题有更好的设计吗?
谢谢。
scala - 访问类型的伴随对象
我有某种类型的变量,我想从伴随对象中获取信息。例如,我认为我可以做这样的事情:
但这相当冗长,minVal
并且:Long
使与 的比较变得复杂i: I
。
我希望我能找到简洁直接的东西,但我怀疑这需要反思,而这通常都不是。
scala - 错误的前向引用但 Scala 脚本运行良好
我正在使用 IntelliJ 的 Scala 插件的最新版本,并拥有以下代码,其目的是允许枚举 class 的实例Count
:
引用id()
伴随对象的方法时,IntelliJ 给了我一个前向引用错误,但脚本编译完美,产生了输出Vector(Count0, Count1, Count2)
。事实上,我只是在成功运行脚本后偶然注意到错误。是什么赋予了?
kotlin - kotlin,如何将扩展功能添加到已定义的类伴随对象
我想向已经定义的类的伴随对象添加一些扩展函数,比如
我也喜欢在接口上做同样的事情,例如
我查阅了文档,只是找到了为用户定义的类中的伴随对象定义扩展函数的语法,而不是没有伴随对象的类
我有机会在 kotlin 中做到这一点吗?
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
在每个伴随对象中定义。但是必须有一种方法可以在特征中定义它,并且只需混合该特征即可。正确的?
scala - 伴随对象的继承
我正在尝试重构一些我目前看起来像这样的模型:
看起来像这样的东西:
这样我就可以做到这一点:
我希望每个模型都定义一个隐式读取值,但我不确定如何在抽象类的伴随对象中指出这一点。
scala - 伴随对象中的 Scala 隐式类型类优先级
编译此代码时,出现以下错误:
为什么implicit def
inSubtrait
伴生对象的优先级不高于 in Supertrait
?
我希望implicit def
subtraits 的伴生对象中的 s 比 supertraits 中的优先级更高。
更新
这个LowPriorityImplicits
技巧也不起作用。请参阅在 Scala 中的隐式实例中强制执行优先级。
scala - 访问基类的受保护成员
我不经常使用继承,所以我不确定为什么它不起作用。在我的项目中,我有以下内容:
具有受保护成员的基本密封类:
它是有一些逻辑的后代:
上面的编译给了我以下错误:
我不太确定从超类调用受保护的成员有什么问题......但是如果我们将它包装到伴生对象中会变得更有趣,它神奇地解决了问题:
scala - 如何弃用案例类的伴随对象?
我注意到如果一个案例类被弃用,它的伴生对象不是。
我想得到一个A(0)
与我得到的完全一样的警告new A(0)
。我应该明确定义伴随对象并弃用它吗?有没有更好的办法?
static - Kotlin 对象 vs 伴生对象 vs 包作用域方法
我在 Kotlin 中编写了这个方法并分析了字节码:
情况一
情况2
情况 3
字节码结果
- 情况1:班级
Test$asb
,public final doSomething()I
- 情况2:班级
Test$Companion
,public final doSomething()I
- 情况3:班级
TestKt
,public final static doSomething()I
我的问题是:
我有一个枚举类,我想返回一个给定枚举变量的枚举实例,例如 findById
(enum(id, color))
。我该怎么做?伴侣对象?目的?似乎拥有真正静态方法的唯一方法是在包级别,没有类声明。但这变得有点过于全球化了。有什么方法可以通过: 访问它
ClassName.staticMethod
, staticMethod 真的是静态的。提供包声明方法、伴生对象和对象的有意义的示例。
语境。我一直在使用 Kotlin 进行编码,我觉得它很棒。但有时我需要做出决定:例如,在 java 中我会声明为 static final 的重不可变属性,但在 Kotlin 中我发现很难“找到等价物”。