【问题标题】:Scala "constructor Stopwatch cannot be accessed in class Main"Scala“无法在 Main 类中访问构造函数秒表”
【发布时间】:2016-05-01 06:05:42
【问题描述】:

解决方案总结,我以为我正在处理 Scala 问题,但事实证明 Stopwatch 和 Scala Logging 具有私有构造函数,并且我没有调用正确的公共方法来实例化它们。 gzm0 在下面的回答指出了这一点。


尝试使用 Guava 秒表和 Scala 日志记录,无论我是在 Main 中还是在实例化类中创建 new Stopwatch()new Logger(),我都会收到 gradle run 的此错误:

constructor Logger in class Logger cannot be accessed in class RedBlackTree4150
var loggerInst = new Logger()
constructor Stopwatch in class Stopwatch cannot be accessed in class RedBlackTree4150
var stopWatchInst = new Stopwatch()

如果这是 thisthis 问题的重复,我不知道如何实现它。我查看了this question,但它没有一个可接受的答案,我尝试(只是为了好玩)将我的括号从我的构造函数调用中去掉。

编写我的第一个 Gradle/Scala 项目以进行算法分析作业。我正在处理的问题。 Scala 不是作业的一部分,所以我没有使用作业标签。

这是我如何称呼它们以及我的程序的第一部分,the full .scala file and the build.gradle are on Github

import com.google.common.base.Stopwatch
import com.typesafe.scalalogging.slf4j.Logger
import scala.collection.immutable.TreeMap
import java.util.concurrent.TimeUnit

object Main extends App {
  // var rbtree = new RedBlackTree4150(logger, stopWatch)
  var rbtree = new RedBlackTree4150()
}
// class RedBlackTree4150 (var loggerInst: Logger, var stopWatchInst: Stopwatch) {
class RedBlackTree4150() {
  var loggerInst = new Logger()
  var stopWatchInst = new Stopwatch()

如您所见,我尝试通过将其全部设为一个对象,并通过在 Main 中实例化 Logger 和 Stopwatch 并将它们传递给类(我知道这是个坏主意)来简化这一点,但这些都不起作用。我在这里缺少什么简单的 Scala 东西?谢谢。


否则我相信我在项目中正确地拥有了我的所有依赖项,并且我在命令行上得到了同样的错误。

我确实还有一个错误I posted as a separate question here,,以防万一,错误是:

/home/jim/workspace/Scala/RedBlackTree4150/src/main/scala/Main.scala:36: value map is not a member of Double
  timingsMap = for (i <- powersList; j <- runTest(i)) yield i -> j

【问题讨论】:

  • (for(i &lt;- 10..20; j=runTest(i)) yield i -&gt; j).toMap
  • @Eduardo 错误的问题大声笑我会试试看,其他人的回答被接受了,因为他能够给出关于构建如何解释事物的解释......你也很有帮助,如何关于这个问题?谢谢
  • 对不起。我对番石榴不熟悉。看起来好像您试图直接访问私有构造函数。您可能不得不调用一些工厂方法来创建实例。一些 Java 库就是这样工作的,但我不确定。
  • 我不认为它是番石榴或秒表,我认为它是 Scala-ish。谢谢!我们会看看出现了什么,在另一页上编辑我的问题以反映各种建议。 :)
  • 我再次得到纠正,再次感谢@Eduardo gzm0 也得到了这个

标签: scala constructor guava slf4j


【解决方案1】:

StopwatchLogger 的构造函数都是私有的。您需要使用工厂方法来实例化它们。

如果是Stopwatch,您可以使用createUnstarted() 方法:

val stopwatch = Stopwatch.createUnstarted()

如果是Logger,则必须使用apply 方法。但是,它需要一个底层的 SLF4J 记录器。你可以通过SLF4J的LoggerFactory创建一个:

import org.slf4j.LoggerFactory
val logger = Logger(LoggerFactory.getLogger(getClass))

【讨论】:

  • 我正在尝试使用 createUnstarted 但它没有解决...哦,是的,我在做一些愚蠢的事情哈哈...一败涂地,现在将接受并投票,并在它出现时发表评论在职的!!我认为我的部分问题是我使用的是 Scala 2.10,所以使用的是旧版本的 Logger,让我再次尝试一下,谢谢!
  • 我是否需要一个 Scala 特定的记录器,或者我可以只使用 Java 中的记录器吗?我正在使用这两个导入:import org.slf4j.LoggerFactoryimport com.typesafe.scalalogging.slf4j.Logger,我假设我在 build.gradle 中需要这个:'org.slf4j:slf4j-api:1.7.13' 现在要试试,我也无法在 slf4j.org/api/org/slf4j/LoggerFactory.html 的规范中找到 apply()
  • com.typesafe.scalalogging.slf4j.Logger 只是任何 SLF4J 记录器的薄包装器(但不是 SLF4J 记录器本身)。 SLF4J 记录器根本不是 Scala 特定的,因此任何实例化 SLF4J 记录器(在 Java 中)的方式都可以。
  • 好吧,我会弄清楚这一点,我试图实现 scala-logging,对于 Scala 2.10 和更早版本,它不在 MavenCentral 上(每个github.com/typesafehub/scala-logging),所以我可能得到了错误的依赖。感谢您的所有帮助,如果您有更多想法,不着急,晚安
  • apply 方法在 Logger 上。 X(y) 是 Scala 中 X.apply(y) 的简写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
相关资源
最近更新 更多