标签: companion-object

与伴生对象的继承

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

case class Person(name: String, age: Int)

object Person {
    implicit val reads: Reads[Person] = (
        (JsPath \ "name").read[String] and
        (JsPath \ "age").read[Int] 
    )(Person.apply _)
}
Run Code Online (Sandbox Code Playgroud)

看起来像这样的东西:

abstract class BaseModel {
    val pk: String  // Some stuff here that will be common
}

object BaseModel {
    implicit val reads: Reads[BaseModel] // Not sure what to do here
}
Run Code Online (Sandbox Code Playgroud)

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

trait MyTrait[Model <: BaseModel] {

    // More code here
    val body: JsObject = ...
    val parsed = body.validate[Model]  // Error: There …
Run Code Online (Sandbox Code Playgroud)

generics inheritance scala companion-object

4
推荐指数
1
解决办法
2688
查看次数

Kotlin:类继承包含伴生对象的接口,但无权访问接口的常量

这是界面:

interface SomeInterface {
   companion object {
      const val MY_CONST = "the constant"
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,类(没有主体,因为只是一个例子):

class SomeClass : SomeInterface
Run Code Online (Sandbox Code Playgroud)

在此之后,当我尝试通过 SomeClass 调用常量时,它不允许我:

SomeClass.MY_CONST
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

inheritance interface kotlin companion-object

4
推荐指数
1
解决办法
1334
查看次数

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

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

所以我在包对象中,为简单起见,

type IntSeq = Seq[Int]
Run Code Online (Sandbox Code Playgroud)

但是,现在我不能apply在伴侣对象上做简单.来自REPL:

scala> IntSeq(1, 2, 3)
<console>:8: error: not found: value IntSeq
              IntSeq(1, 2, 3)
              ^
Run Code Online (Sandbox Code Playgroud)

该怎么办?

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

编辑:有一个类似的问题 - Scala类型别名包括伴侣对象[初学者]

在这个问题上,有两个回复,两个都不起作用.

一个是使用apply定义我的自定义对象,但我不知道如何在我的情况下这样做,再加上它有点冗长.

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

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

scala companion-object

3
推荐指数
1
解决办法
833
查看次数

Scala中的工厂设计模式与案例类

我正在尝试使用随播对象上提供的apply方法在Scala中实现工厂设计模式.我有以下方法.

sealed trait MyType {
  def param: String
}

case class TypeA(param: String) extends MyType
case class TypeB(param: String, anotherParam: String) extends MyType 

object MyType {
  def apply(param: String): TypeA = ???
  def apply(param, anotherParam: String): TypeB = ???
}
Run Code Online (Sandbox Code Playgroud)

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

scala companion-object

3
推荐指数
1
解决办法
3364
查看次数

kotlin,如何向已经定义的类伴随对象添加扩展函数

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

fun Toast.Companion.showImageToast(str : String) {
}
Run Code Online (Sandbox Code Playgroud)

而且我喜欢在界面上做同样的事情,例如

fun Runnable.Companion.mainHandler() {
}
Run Code Online (Sandbox Code Playgroud)

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

我有机会在kotlin这样做吗?

kotlin companion-object

3
推荐指数
1
解决办法
744
查看次数

为什么我没有看到扩展类的伴随对象组件?

我有一个抽象类:

abstract class Vec2t

和扩展类:

class Vec2 : Vec2t

Vec2t有以下配套对象:

companion object {

    @JvmField val length = 2
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入时Vec2.length,它被标记为未解决的参考...

为什么?我错过了什么?

kotlin companion-object

3
推荐指数
1
解决办法
318
查看次数

自动为案例类生成案例对象

如何让 Scala 编译器自动生成 case 对象?

// Pizza class
class Pizza (val crust_type: String)

// companion object
object Pizza {
    val crustType = "crust_type"
}
Run Code Online (Sandbox Code Playgroud)

案例对象的所需属性

  • 为每个属性case class生成一个属性case object
  • 设置在每个相应的情况下,对象的属性名称和变化的字符串表示的值camelCasesnake_case该对象的属性名,保持snake_case为对象的属性值

scala case-class companion-object scala-macros scalameta

3
推荐指数
1
解决办法
733
查看次数

“Parcelable 协议需要一个名为 CREATOR 的 Parcelable.Creator 对象”(我确实有 CREATOR) - 在 Kotlin 中

我收到错误消息“Parcelable 协议需要一个名为 CREATOR 类的 Parcelable.Creator 对象......”,但我确实有一个 Creator,但我不知道它有什么问题。我从https://developer.android.com/reference/android/os/Parcelable复制它并更改了类名以适合我的代码。我怀疑从 Java 到 Kotlin 的(自动)转换并不完美(或者准确地说:它是否与需要的略有不同),但我不知道问题到底是什么。

有一个具有相同错误消息的线程(Parcelable 协议需要一个名为 CREATOR(我确实有 CREATOR)的Parcelable.Creator对象),但问题在于“fun writeToParcel”的写入顺序与读取顺序不同“有趣的数据处理程序”。在我的情况下,这不是问题,因为它的顺序相同。

那里的另一个答案指出,函数需要是静态的可能是一个问题。但是,Kotlin 没有“静态”功能。我读到它是用“同伴对象”完成的。我试过了(见下文),但它引发了另一个错误 - 我不确定它是否会起作用。

class DataHandler : Parcelable {

    var player1name = ""
    var player1color = 0

    //main constructor
    fun DataHandler(player1name: String, player1color: Int) {
        this.player1name = player1name
        this.player1color = player1color
    }


    //write object values to parcel for storage
    override fun writeToParcel(dest: Parcel, flags: Int) {
        //write all properties to the parcle
        dest.writeString(player1name)
        dest.writeInt(player1color)
    }

    //constructor used for …
Run Code Online (Sandbox Code Playgroud)

android parcel parcelable kotlin companion-object

3
推荐指数
1
解决办法
1789
查看次数

特性和对象为何以及何时应具有相同的名称?

是什么原因

  trait Dog {
    def bark = "woof"
  }
  object Dog extends Dog
Run Code Online (Sandbox Code Playgroud)

有效,但以下内容不起作用

trait Dog {
  def bark = "woof"
}
class Dog extends Dog
Run Code Online (Sandbox Code Playgroud)

我在某处读到,在上述第一种情况下,该对象不是伴随对象。对象和特征应具有相同的名称时会发生什么情况?

scala traits companion-object

3
推荐指数
1
解决办法
253
查看次数

分类器 JSONObject 没有 'companion 对象,因此必须在此处初始化

import org.json.JSONObject
JSONObject deviceInformation = ...
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我试图创建一个像这样的伴随对象,但没有真正起作用......对不起,Java和Kotlin中的菜鸟...... 在此处输入图片说明

是的,JSONObject 是正确导入的

import org.json.JSONObject

java intellij-idea kotlin companion-object

2
推荐指数
1
解决办法
5382
查看次数