scala - 为什么私有(private)构造函数在案例类中仍然可见?

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

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

A.scala

package X

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

case class A private(private val s: Seq[Int])

B.scala

package Y

import X.A

class B {
  val b = A(Seq.empty)
}

虽然我只想使 apply(x:Int) 可见,但该代码会编译,因此私有(private)构造函数也可见。如何更改此代码以使其按我的预期工作?

最佳答案

将方法 A.apply(Seq[Int]) 也设为私有(private)

A.scala

package X

object A {
  def apply(x: Int): A = A(Seq(x))
  private def apply(s: Seq[Int]): A = new A(s) // make explicit and private instead of auto-generated and public
}

case class A private(private val s: Seq[Int])

B.scala

package Y

import X.A

class B {
  //val b = A(Seq.empty) // doesn't compile
}

这里的行 val b = A(Seq.empty) 产生错误

Error: polymorphic expression cannot be instantiated to expected type;
 found   : [A]Seq[A]
 required: Int

即方法 A.apply(Seq[Int])B 中不可见。

关于scala - 为什么私有(private)构造函数在案例类中仍然可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62931376/

相关文章:

scala - 如何将 RDD[Row] 转换为 RDD[String]

java - 如何在子类中访问父类(super class)的 protected 方法?

scala - Scala 中案例类的 hashCode

java - 如何在案例类中重用类参数?

Scala 案例类副本并不总是适用于 `_` 存在类型

unit-testing - ScalaTest 和 Scala Specs 单元测试框架有什么区别?

scala - 如何在 stub 上调用真实方法

c# - 部分隐藏外部程序集的接口(interface)方法

可以扩展自身的 Scala 集合类?摘要序列困惑

java - 创建一个无法创建其对象的类