2016-01-25 49 views
0

決議摘要,我以爲我正在處理一個斯卡拉問題,但事實證明秒錶和斯卡拉日誌記錄有私人構造函數,我沒有調用適當的公共方法來實例化他們。下面的gzm0的答案指出了這一點。斯卡拉「構造函數秒錶不能在類主要訪問」


試圖用番石榴秒錶和Scala記錄,無論我在主或在實例化類中創建一個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,但它沒有一個可接受的答案,並且我嘗試了(只是爲了好玩)將我的parens從我的構造函數調用中無效。

編寫我的第一個Gradle/Scala項目分析算法分配。我想如果我在Java中,我會問靜態與非靜態,不知道這是我正在處理的問題的類型。斯卡拉不屬於任務的一部分,所以我沒有使用作業標籤。

這裏是如何,我打電話給他們,我的計劃的第一部分,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() 

正如你可以看到我已經試圖通過使簡化這一點,所有的一個對象,並通過在主實例記錄器和秒錶並將它們傳遞給班級(我知道的不好主意),但沒有任何作用。我在這裏錯過了什麼簡單的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 
+0

'(對於(I' - 10..20; J =的runTest(i))的產率I - > j)的.toMap' – Eduardo

+0

@Eduardo錯誤的問題LOL我將試試看,其他人的回答是被接受的,因爲他能夠給出關於構建如何解釋事物的解釋......你也非常有幫助,那麼這個問題呢?謝謝 – JimLohse

+0

對不起。我不熟悉番石榴。它看起來好像你試圖直接訪問一個私有構造函數。您可能需要調用一些工廠方法來創建實例。有些Java庫像這樣工作,但我不確定。 – Eduardo

回答

4

兩個StopwatchLogger的構造函數是私有的。你需要使用工廠方法來實例化它們。

Stopwatch的情況下,你可以使用createUnstarted()方法:

val stopwatch = Stopwatch.createUnstarted() 

Logger情況下,你必須使用apply方法。但是,它需要一個底層的SLF4J記錄器。可以通過SLF4J的LoggerFactory創建一個:

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

我正在嘗試使用createUnstarted,它並沒有解決......哦,呃,是的,我做了一些愚蠢的哈哈......一個下降的一個,將現在接受並讚揚,並在工作時發表評論!我認爲我的問題的一部分是我在Scala 2.10上,所以使用老版本的Logger,讓我再試一次,謝謝! – JimLohse

+0

我是否需要一個Scala特定的記錄器出於任何原因,或者我可以只使用我在Java中的?我使用兩個進口:'import org.slf4j.LoggerFactory'和'import com.typesafe.scalalogging.slf4j.Logger',我假設我需要這個在我的build.gradle中:''org.slf4j:slf4j-api:1.7 .13''現在就試用它,我也無法在http://www.slf4j.org/api/org/slf4j/LoggerFactory.html – JimLohse

+1

'com.typesafe.scalalogging的spec中找到apply()。 slf4j.Logger'只是任何SLF4J記錄器的薄包裝(但不是SLF4J記錄器本身)。 SLF4J記錄器根本不是Scala特有的,因此您可以通過任何方式實例化SLF4J記錄器(使用Java)。 – gzm0