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

发布于 2024-11-09 02:34:36 字数 293 浏览 0 评论 0原文

这行不通:

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

但是这行得通:

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

我确信这是一个非常基本的事情,而且我知道数组在 Scala 中的行为可能有点不寻常。

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

This does not work:

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

But this does:

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

I am sure this is a pretty basic thing and I know that Arrays can behave a bit unusual in Scala.

Could someone explain to me how to create such an Array and also why it doesn't work in the first place?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我为君王 2024-11-16 02:34:36

这是由于 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 了解更多详细信息。我引用(在您的情况下将 EvenElems 替换为 elem)

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

特别是,您还可以使用 ClassManifest

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

类似问题:

This is due to JVM type erasure. Manifest were introduce to handle this, they cause type information to be attached to the type T. This will compile:

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

There are nearly duplicated questions on this. Let me see if I can dig up.
See http://www.scala-lang.org/docu/files/collections-api/collections_38.html for more details. I quote (replace evenElems with elem in your case)

What's required here is that you help the compiler out by providing some runtime hint what the actual type parameter of evenElems is

In particular you can also use ClassManifest.

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

Similar questions:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文