簡體   English   中英

類型不匹配,找到單位,必填整數。 使用模式匹配,將Scala與Java庫一起使用

[英]Type mismatch, found Unit, required Int. Using pattern matching, Scala with Java libraries

我正在嘗試為Spark sql注冊一些udfs(用戶定義的函數),當我嘗試進行編譯時,出現以下代碼的類型不匹配錯誤:

csc.udf.register("DATEADD", (datePart: String, number: Int, date: Timestamp) => {
    val time: Calendar = Calendar.getInstance
    datePart match {
        case "Y" => time.add(Calendar.YEAR, number)
        case "M" => time.add(Calendar.MONTH, number)
        case "D" => time.add(Calendar.DATE, number)
        case "h" => time.add(Calendar.HOUR, number)
        case "m" => time.add(Calendar.MINUTE, number)
        case "s" => time.add(Calendar.SECOND, number)
        case _ => 0
    }
}: Int)

這是我得到的錯誤:

[error] /vagrant/SQLJob/src/main/scala/sqljob/context/CassandraSQLContextFactory.scala:111: type mismatch;
[error]  found   : Unit
[error]  required: Int
[error]                                 case "Y" => time.add(Calendar.YEAR: Int, number)
[error]                                                     ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 7 s, completed Jul 2, 2015 4:19:29 PM

Calendar類來自java.util.Calendar

如果來自java.sql.Timestamp,則為時間戳

您的函數類型是(String, Int, Timestamp) => Int因此它應該返回一個Int

Calendar.add是最后一個表達式,因此由該函數返回,但其返回類型是Unit而不是Int 這就是為什么您會得到一個錯誤提示。

Calendar.add實際上使該對象變異並返回void (Scala中的Unit )。 相反,您應該time調用訪問器方法之一來檢索它的數字表示形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM