2011-05-21 74 views
8

这不起作用:为什么我不能创建一个泛型类型的数组?

def giveArray[T](elem:T):Array[T] = { 
    new Array[T](1) 
    } 

但这:

def giveList[T](elem:T):List[T] = { 
    List.empty[T] 
    } 

我相信这是一个非常基本的东西,我知道数组可以在Scala中表现得有点不寻常。

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

回答

17

这是由于JVM类型的擦除。清单是介绍处理这个问题,它们会导致类型信息附加到类型T.这将编译:本

def giveArray[T: Manifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

有近重复的问题。让我看看我能不能挖掘。 有关更多详细信息,请参见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) 
} 

类似的问题:

+0

我以为是问过很多次,但我无法找到任何东西。感谢您再次回答:) – 2011-05-21 23:43:41

+0

哦,我以前从来没有回答过这个问题。我回过头问同样的问题:)我认为在这种情况下,如果用“scala”和错误信息搜索,你最终会发现它。 – huynhjl 2011-05-21 23:53:42

+3

更确切地说,这是因为'T'被擦除,但数组不_。值得注意的是,'ClassManifest'更快。 – 2011-05-22 02:47:12

相关问题