Scala:如何强制将整数包装为对象?

时间:2013-05-25 16:16:14

标签: scala object int

我在这里收到错误:

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

如何将此1转换为scala中的整数对象? 我的目的是将其传递给Array[Int with Object]。 它当前显示错误:

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

修改

我有这个错误,因为我在scala中使用了一个android ArrayAdapter,因此通过定义:

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

它抛出了这个错误:

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

所以我需要将T替换为T <: Object

中的class ImageAdapter[T <: Object](ctx: ...

1 个答案:

答案 0 :(得分:33)

Int是一种scala类型,通常映射到java的int,但在装箱时会映射到java.lang.Integer。无论是否盒装都是scala中的透明度。

无论如何,Int绝对不是java.lang.Object的子类型。实际上IntAnyVal的子类型,它不是java.lang.Object的子类型。因此,Int with Object非常荒谬,因为您不能拥有Intjava.lang.Object的任何具体类型。

我认为你的意思是:

val i: Object = a

或者更具有说服力:

val i: AnyRef = a

当然,这些都不会编译,但您可以通过强制转换为Int来强制AnyRef值的装箱:

val i: AnyRef = a.asInstanceOf[AnyRef]

与一般情况不同,将AnyVal投射到AnyRef始终是安全的,并且会强制装箱。

您还可以使用更具体的Int.box功能:

val i: AnyRef = Int.box(a)