2015-08-29 10 views
10

Qual è la differenza tra BoxedUnit e Unit in Scala? Quando vengono utilizzati come tipo di ritorno di una funzione? E qual è la loro relazione con REF? Ecco un errore di tipo mancata corrispondenza che ho riscontrato quando si trattava dell'unità.BoxedUnit vs. Unit in Scala

error: java.lang.AssertionError: assertion failed: Can't convert from UNIT to REF(class BoxedUnit) in unit hello.scala at source-/Users/shiyu/Scala/FinalDataFlow/src/print/hello.scala,line-347,offset=13999

risposta

11

Unit è il tipo del valore unico (), pronunciato "unità".

BoxedUnit è un particolare attuazione di Scala sulla JVM, usato per codificare () quando entra in un contesto generico, o è altrimenti assegnato Any. Normalmente, non dovresti sentire parlare di BoxedUnit in primo luogo, anche se presenta alcune caratteristiche a livello di utente. Ad esempio ((): Any).getClass().getName() == "scala.runtime.BoxedUnit".

Detto questo, l'errore che si ottiene è chiaramente un crash del compilatore, come evidenziato dallo AssertionError. Non è un problema nel tuo codice. Probabilmente dovresti report this as a bug se non è già nel database dei bug.

+0

@srjd cosa succede se provo a riprodurre il modello su un AnyVal che può contenere un'unità? Ad esempio, ho provato a usare 'caso Right (Unit)' e non corrispondeva. Come dovrei fare questo abbinamento di modelli? –

+0

Sto usando 'caso Right (anyVal) if (anyVal == Unit || anyVal.isInstanceOf [BoxedUnit])' e funziona ma lo trovo un po 'brutto dal punto di vista del client –

+1

'caso Right (())' . Il valore univoco di * tipo * 'Unit' è'() '. Il valore * 'Unità' è in realtà l'oggetto complementare della classe 'Unit', che non è la stessa cosa di'() '. – sjrd