2013-05-25 2 views
8

Sto ottenendo un errore qui:Scala: Come forzare il wrapping di un intero come un oggetto?

val a: Int = 1 
val i: Int with Object = a 

Come posso convertire questo 1 a un oggetto intero in scala? Il mio scopo è quello di passarlo a un Array[Int with Object]. Attualmente visualizza l'errore:

error type mismatch 
found : Int(1) 
required: Int with java.lang.Object 
     val i: Int with Object = a 
           ^

EDIT

ho questo errore perché sto utilizzando un androide ArrayAdapter da Scala, e quindi definendo:

class ImageAdapter[T](ctx: Context, viewResourceId: Int, pointers: Array[T]) extends ArrayAdapter[T](ctx, viewResourceId, pointers) { ... } 

mi tiri questo errore:

overloaded method constructor ArrayAdapter with alternatives: 
(android.content.Context,Int,java.util.List[T])android.widget.ArrayAdapter[T] <and> 
(android.content.Context,Int,Array[T with Object])android.widget.ArrayAdapter[T] <and> 
(android.content.Context,Int,Int)android.widget.ArrayAdapter[T] 
    cannot be applied to (android.content.Context, Int, Array[T]) 

quindi ho bisogno di sostituire T con T <: Object in class ImageAdapter[T <: Object](ctx: ...

+2

oggetto non è un tratto - che cosa 'Int con Object' ancora dire? –

+0

Sto usando la classe Android 'ArrayAdapter', e da scala richiede qualcosa di tipo' Array [T with Object] '. Da Java richiede un 'java.lang.Object []'. –

+1

Puoi mostrarci il tuo codice reale in modo che possiamo capire come ti ritrovi con il tipo 'Array [T con Object]'? –

risposta

26

Int è un tipo di scala che associa di solito a java di int, ma saranno indirizzate verso java.lang.Integer volta inscatolato. Che sia in scatola o meno è per lo più trasparente in scala.

In ogni caso, Int non è sicuramente un sottotipo di java.lang.Object. Infatti Int è un sottotipo di AnyVal che non è un sottotipo di java.lang.Object. Pertanto, Int with Object è praticamente privo di senso, poiché non è possibile avere alcun tipo concreto che sia sia uno Int sia uno java.lang.Object.

Penso che quello che volevi dire è piuttosto qualcosa di simile:

val i: Object = a 

O più idomatically:

val i: AnyRef = a 

Naturalmente, niente di tutto questo viene compilato, ma è possibile forzare la boxe del valore Int dal casting a AnyRef:

val i: AnyRef = a.asInstanceOf[AnyRef] 

A differenza di Nel caso generale, il lancio di un AnyVal su un AnyRef è sempre sicuro e imporrà la boxe.

è anche possibile utilizzare la funzione più specifica Int.box:

val i: AnyRef = Int.box(a)