2013-05-25 9 views
8

Dostaję błąd tutaj:Scala: Jak wymusić zawijanie liczby całkowitej jako obiektu?

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

Jak mogę przekonwertować to 1 do obiektu całkowitej w Scala? Moim celem jest przekazanie go do Array[Int with Object]. Obecnie wyświetla błąd:

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

EDIT

mam ten błąd, ponieważ używam android ArrayAdapter od Scala, a zatem poprzez określenie:

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

rzuca mnie ten błąd:

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]) 

Więc muszę wymienić T z T <: Object w class ImageAdapter[T <: Object](ctx: ...

+2

obiekt nie jest cechą - co 'Int z Object' ogóle znaczy? –

+0

Używam klasy Android 'ArrayAdapter', a od scala wymaga czegoś typu' Array [T with Object] '. Z Java wymaga 'java.lang.Object []'. –

+1

Czy możesz pokazać nam swój aktualny kod, abyśmy mogli zrozumieć, jak skończysz z typem 'Array [T with Object]'? –

Odpowiedz

26

Int jest rodzajem scala które zazwyczaj mapuje Java int, ale będzie mapować do java.lang.Integer gdy zapakowane. To, czy jest pudełkowane, czy nie, jest przeważnie przezroczyste w scala.

W każdym razie, Int zdecydowanie nie jest podtypem java.lang.Object. W rzeczywistości Int jest podtypem AnyVal, który nie jest podtypem java.lang.Object. Tak więc Int with Object jest prawie bezsensowne, biorąc pod uwagę, że nie można mieć żadnego konkretnego typu, który jest zarówno Int i java.lang.Object.

myślę, co oznaczało to raczej coś w rodzaju:

val i: Object = a 

lub więcej idomatically:

val i: AnyRef = a 

oczywiście, nic z tego nie kompiluje, ale można wymusić boks wartości Int odlewanie do AnyRef:

val i: AnyRef = a.asInstanceOf[AnyRef] 

W przeciwieństwie do ogólny przypadek, rzucanie AnyVal do AnyRef jest zawsze bezpieczny i będzie wymuszał boks.

Można również użyć bardziej konkretnego Int.box funkcję:

val i: AnyRef = Int.box(a) 
Powiązane problemy