为什么我不能创建泛型类型的数组?

Pla*_*kül 9 arrays scala

这不起作用:

def giveArray[T](elem:T):Array[T] = {
    new Array[T](1)
  }
Run Code Online (Sandbox Code Playgroud)

但这样做:

  def giveList[T](elem:T):List[T] = {
    List.empty[T]
  }
Run Code Online (Sandbox Code Playgroud)

我确信这是一个非常基本的东西,我知道Arrays在Scala中表现得有点不寻常.

有人可以向我解释如何创建这样一个数组,以及为什么它首先不起作用?

huy*_*hjl 19

这是由于JVM类型擦除.引入Manifest来处理这个问题,它们会将类型信息附加到类型T上.这将编译:

def giveArray[T: Manifest](elem:T):Array[T] = {
  new Array[T](1)
}
Run Code Online (Sandbox Code Playgroud)

对此有几乎重复的问题.让我看看我是否可以挖掘.有关详细信息,请参阅http://www.scala-lang.org/docu/files/collections-api/collections_38.html.我引用(在你的情况下用elem替换evenElems)

这里需要的是通过提供一些运行时提示来帮助编译器,提示evenElems的实际类型参数是什么

特别是你也可以使用ClassManifest.

def giveArray[T: ClassManifest](elem:T):Array[T] = {
  new Array[T](1)
}
Run Code Online (Sandbox Code Playgroud)

类似的问题:

  • 更确切地说,这是因为`T`被删除但是数组_不是.值得注意的是,"ClassManifest"更快. (3认同)
  • 此外,Java没有这个问题,因为你不能在Java中将原语作为泛型传递,而在Scala中则可以.换句话说,你不能在Java中创建一个返回`Array <int>`的`Array <T> giveArray <T>`,但是Scala中的`giveArray [T]`可以.我认为这是一个重要的观点. (3认同)