标签: companion-object

我可以在伴侣对象中使用"this"吗?

在一个伴侣对象中,我希望有一个字段记录从伴侣类中实例化的所有实例(它是抽象的),我可以这样做吗?

特别是,我认为this会引用子类的任何实例,但是当我在伴随对象中使用它时它将不会编译.

scala companion-object

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

特征是否可以保证它在编译或运行时由伴随对象继承

我有一个特性,初始化本身并不是线程安全的,但是它主要用作伴随对象的基础,根据定义,初始化线程安全的.

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

scala traits companion-object

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

案例类和伴侣的不同顺序的隐式解决方案

通常,我首先在同一个文件中写一个case class然后是同伴object,就在下面.但是当试图导入implicit同伴中的声明时,我被迫切换声明的顺序(显然我不想要).克服这种情况的建议做法是什么?

对于具体情况,以下代码不起作用:

  object SomeLib {
     def doSomething[T : List](t: T) = "meh"
  }

  case class FooWorker(x: String) {
    import FooWorker._ // bring the implicit in scope for doSomething
    def then(event: String) : FooWorker = {
      copy(x = SomeLib.doSomething(event)) // requires implicit
    }
  }

  object FooWorker {
    implicit val list = List("a", "b", "c")
  }
Run Code Online (Sandbox Code Playgroud)

但如果我object FooWorkercase class FooWorker它确实工作之前宣布.我正在使用Scala 2.11.6和SBT进行测试.非常感谢!

scala implicit case-class context-bound companion-object

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

错误的转发参考但Scala脚本运行完美

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

class Count() {
  val id = Count.id()
  override def toString = s"Count$id"
}

object Count {
  var n = -1
  def id() = { n += 1; n }
}

println(Vector(new Count, new Count, new Count))
Run Code Online (Sandbox Code Playgroud)

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

scala intellij-idea companion-object

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

为什么私有构造函数在 case 类中仍然可见?

我想将构造函数及其字段隐藏在一个类中,并且只使用伴随对象创建实例,但我无法实现。我有 Scala 2.13.3,它基于 java 8。这是一个代码示例:

斯卡拉

package X

object A {
  def apply(x: Int): A = A(Seq(x))
}

case class A private(private val s: Seq[Int])
Run Code Online (Sandbox Code Playgroud)

甜菜

package Y

import X.A

class B {
  val b = A(Seq.empty)
}
Run Code Online (Sandbox Code Playgroud)

虽然我只想让apply(x:Int)这段代码可见,但编译后的私有构造函数也是可见的。如何更改此代码以按预期工作?

scala access-modifiers private-constructor case-class companion-object

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

Scala工厂被编译器忽略了吗?

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

class Stuff(val a: Int, val b: Long) { this() = this(0,0L) }

object Stuff {
  def apply(a:Int, b:Int) = new Stuff(a, b.toLong)
}
Run Code Online (Sandbox Code Playgroud)

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

val widget = new Stuff(1,2)
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事!?我刚做完了!?救命!!!

scala syntactic-sugar companion-object

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

智能构造函数的Scala案例类实现?

尝试使用案例类实现智能构造函数。设法copy很好地覆盖了该方法,并且我认为apply伴随对象中的 应该可以解决问题,但是在尝试传入BigInt. 我尝试放入def apply(value: BigInt): Option[Natural]但随后scalac抱怨符号冲突。

import spire.math.Integral // companion object contains implicit Integral[BigInt]

case class Natural private (value: BigInt) {
  def copy(value: BigInt = this.value): Option[Natural] =
    Natural.apply(value)
}

object Natural {
  def apply[A](x: A)(implicit A: Integral[A]): Option[Natural] =
    if (A.isPositive(x)) Some(Natural(x))
    else None
}

/** In Foo.scala */
Natural(5L) // Option[Natural] = Some(Natural(5))
Natural(BigInt(5L)) // constructor Natural in class Natural cannot be accessed in object Foo
Run Code Online (Sandbox Code Playgroud)

也许这样的事情是不可能的?

scala case-class companion-object

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

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

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

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

示例代码:

object ShowMain {

  def main(args: Array[String]): Unit = {
    output("hello")
  }

  def output[A](a: A)(implicit show: Show[A]) =
    println(show.show(a))

}

trait Show[-A] {
  def show(a: A): String
}

object Show {

  implicit object StringShow extends Show[String] {
    def show(s: String) = s"[String: $s]"
  }

}
Run Code Online (Sandbox Code Playgroud)

编译错误:

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

Multiple markers at this line
    - not enough arguments for method output: …
Run Code Online (Sandbox Code Playgroud)

scala implicit typeclass companion-object

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

将通用伴随对象传递给超级构造函数

我正在尝试通过消息(在 Akka 游戏环境中)构造 atraitabstract classto 子类型,以便我可以轻松地将它们转换为Json.

到目前为止做了什么:

    abstract class OutputMessage(val companion: OutputMessageCompanion[OutputMessage]) {
        def toJson: JsValue =  Json.toJson(this)(companion.fmt)
    }


    trait OutputMessageCompanion[OT] {
        implicit val fmt: OFormat[OT]
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试按如下方式实现上述接口时:

    case class NotifyTableChange(tableStatus: BizTable) extends OutputMessage(NotifyTableChange)

    object NotifyTableChange extends OutputMessageCompanion[NotifyTableChange] {
        override implicit val fmt: OFormat[NotifyTableChange] = Json.format[NotifyTableChange]
    }

Run Code Online (Sandbox Code Playgroud)

我从 Intellij 收到此错误: Type mismatch, expected: OutputMessageCompanion[OutputMessage], actual: NotifyTableChange.type

我对 Scala 泛型有点陌生 - 所以对一些解释的帮助将不胜感激。

PS我愿意接受比提到的更通用的解决方案。目标是,在获取任何子类型OutputMessage- 时,轻松将其转换为Json.

generics json scala companion-object

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

具有枚举约束的 Kotlin 泛型函数

我想做如下的事情:

inline fun<T: Enum<T>> myFunction(enumStr: String){
    T.valueOf(enumStr)
    //...
}
Run Code Online (Sandbox Code Playgroud)

这样我的泛型参数就被限制为枚举类类型,以便我可以访问 valueOf 函数。我收到一条错误消息,指出:
Type parameter 'T' cannot have or inherit a companion object, so it cannot be on the left hand side of dot

我理解这意味着我不能在泛型上使用伴随对象函数。有什么方法可以实现我想要的 - 将字符串转换为通用枚举?

generics enums kotlin companion-object

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