为什么数组需要 ClassTags 而 List 这样的集合不需要?

2023-12-24

这工作正常:

def x[A](a: A) = List(a)

没有适用于 A 的 ClassTag:

def y[A](a: A) = Array(a)

但这当然是犹太洁食:

def y[A : ClassTag](a: A) = Array(a)

是什么赋予了?


数组在运行时保留其类型,但泛型方法由于类型擦除而在运行时失去其通用性。因此,如果您在运行时从泛型方法动态创建数组,则必须保留泛型类型信息。由于擦除,JVM 不知道类型,但 Scala 以 ClassTag 的形式保留信息,使您可以避免擦除问题。

你可以通过使用 Java 反射来作弊

def y[A](a: A, length: Int) = java.lang.reflect.Array.newInstance(a.getClass, length)

但这会很糟糕 - 请注意,由于擦除,返回的类型是 Object,而不是 Array[A]

scala> y("foo", 1)
res2: Object = Array(null)

另请注意,java.lang.reflect.Array.newInstance() 在API文档 https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Array.html.

这是有道理的,因为 Java 具有擦除功能并且没有 ClassTags。

Scala 有 ClassTags,因此可以使用适当的类型创建在运行时创建的数组:

scala> def y[A : ClassTag](a: A) = Array(a)
y: [A](a: A)(implicit evidence$1: scala.reflect.ClassTag[A])Array[A]

scala> y("foo")
res4: Array[String] = Array(foo)

scala> y(1)
res5: Array[Int] = Array(1)

在此处了解有关 JVM 上的类型擦除的更多信息(Java 示例):

  • 删除泛型类型 https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html
  • 删除泛型方法 https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html
  • 擦除桥接方法 https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html
  • 不可具体化的类型 https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html

当然,由于擦除,A的List在运行时变成了AnyRef的List,因此只要在编译时验证类型检查(通过泛型),JVM在运行时并不关心泛型对象的类型是什么。被实例化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么数组需要 ClassTags 而 List 这样的集合不需要? 的相关文章

  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • Scala 除以零会产生不同的结果

    我对 Scala 如何处理除以零感到困惑 这是 REPL 代码片段 scala gt 1 0 java lang ArithmeticException by zero 33 elided scala gt 1 toDouble 0 toD
  • 哪个更快:清除集合或实例化新集合

    我的代码中有一些通用列表 其中有数十或数百个元素 有时我需要用其他对象重新填充此列表 所以问题是 调用什么会更快Clear 方法或创建一个new List
  • 在 Scala 中是否可以指定匿名函数的返回类型?

    我知道您可以创建一个匿名函数 并让编译器推断其返回类型 val x gt System currentTimeMillis 只是为了静态类型的缘故 是否也可以指定其返回类型 我认为这会让事情变得更加清晰 val x gt System cu
  • 类型不匹配;发现:长 需要:Int

    我有一个应该返回 Long 的方法 但我收到一个错误 type mismatch found Long required Int 方法如下 def getRandom IMEI from Long to Long Long if from
  • 如何识别远程参与者?

    我有一个远程参与者 客户端 它正在向另一个远程参与者 服务器 注册 然后注销 使用关闭挂钩 然而 虽然服务器接收到注销 但实际sender财产是一个不同的 Channel 对象 所以在我的服务器日志中我有 Registered new cl
  • scala 中的模拟案例类:Mockito

    在我的游戏应用程序中 我打算模拟一个案例类 我可以这样做 但它创建了一个所有成员变量都为空的对象 有没有办法创建案例类的模拟对象 以便该对象可以初始化一些成员 case class User name String address Stri
  • 具有动态命名参数的 Scala 案例类副本

    对于具有参数数量的 scala 案例类 21 e g case class Car type String brand String door Int 其中类型 吉普车 品牌 丰田 门 4 etc 还有一个复制方法允许使用命名参数覆盖 Ca
  • C# 中具有字符串键类型的不区分大小写字典

    如果我有一个Dictionary
  • 如何列出所有 sbt 依赖项?

    我需要列出所有 sbt 依赖项 以便检查是否已存在 debian 软件包 我还注意到有一个 DEB 包 http www scala sbt org 0 13 tutorial Installing sbt on Linux html但似乎
  • 从 SortedList 或 SortedDictionary 获取第 i 个值

    我有一个排序的对象集合 它可以是 SortedList 或 SortedDictionary 我将主要使用它来阅读 因此增加性能并不那么重要 我怎样才能得到第i个值 所以例如当我的集合中有数字 1 2 3 4 5 并且我想要中位数 本例中为
  • Play框架:读取包含空值的Json

    我正在尝试在 Play Scala 程序中读取 Json 数据 Json 的某些字段可能包含空值 因此我定义 Reads 对象的方式如下 implicit val readObj Reads ApplyRequest JsPath a re
  • 获取两个顶点之间的边属性值时出现 ClassCastException

    我正在尝试获取两个顶点之间的边缘属性值并低于异常 java lang ClassCastException 无法将 java lang String 转换为 scala runtime Nothing 环境 内存中的泰坦 Code val
  • Scala 条件列表构造

    我正在使用 Scala 2 9 2 并且想根据某些条件构建一个列表 考虑以下情况 其中 cond 是采用谓词 p 和类型 T 的值 在本例中为 t3 的某个函数 t1 t2 cond p t3 t4 我想要的行为如下 如果 p 为真 则应给
  • Spark Streaming 中是否需要检查点

    我注意到 Spark 流示例也有检查点代码 我的问题是检查点有多重要 如果是为了容错 那么在此类流应用程序中发生故障的频率是多少 这一切都取决于您的用例 假设您正在运行一个流作业 它仅从 Kafka 读取数据并计算记录数 如果您的应用程序在
  • 尝试创建 jar 时出现 UNRESOLVED DEPENDENCIES 错误

    我正在尝试构建一个 Scala jar 文件以在 Spark 中运行它 我正在关注这个tutorial http spark apache org docs latest quick start html 当尝试使用 sbt 作为构建 ja
  • Scala 中缺少多重集吗?

    我正在尝试 Scala 中的 Facebook Hacker Cup 2013 资格赛问题 对于第三个问题 我觉得需要一个有序的 Multiset 但在 scala 的 2 10 集合中找不到一个 scala 的集合中是否缺少此数据结构 会
  • 带可变参数的 Spark UDF

    如文档中所示 列出最多 22 个参数是唯一的选择吗 https spark apache org docs 1 5 0 api scala index html org apache spark sql UDFRegistration ht
  • 如何在 C# 中使用键对 NameValueCollection 进行排序?

    我编写了以下代码 它也有效 但我想知道它们是否比这更好 NameValueCollection optionInfoList if aSorting optionInfoListSorted new nameValueCollection
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h

随机推荐

  • 连接sql中的所有列值

    如何将从 sql 查询返回的不同行的所有列值合并为一个值 这是一个例子 查询返回 FOO RES1 RES2 RES3 现在我想要得到如下结果 FOOCONCAT RES1RES2RES3 有什么方法可以在sql中做到这一点吗 In SQL
  • 如何防止 MSI 错误:正在安装另一个程序?

    我编写了一个小 PowerShell 脚本 它调用不同的 MSI 文件来安装软件 有时我从 Windows Installer 中收到以下错误 正在安装另一个程序 请等待安装完成 然后再次尝试安装该软件 在调用 MSI 文件之前如何防止此错
  • 在 servlet 中从文件系统提供静态图像文件?

    如何通过 servlet 在文件系统中提供图像文件 看看这里 示例 Depot 在 Servlet 中返回图像 http www exampledepot com egs javax servlet GetImage html 链接已损坏
  • google-apps-script 用于编辑 Gmail 主题行

    问题是这样的 你可以搜索一下 发现很多人抱怨这个问题 假设您出售某种商品 例如经营一家在互联网上销售的小企业 并使用 PayPal 接受付款 PayPal 发送的每一条付款通知均具有完全相同的主题行 收到付款通知 因此 如果您收到 Bobb
  • KitKat版本之前的Android中如何获取短信应用程序(默认)的包名?

    Android KitKat版本之后 我们可以通过 Telephony sms getDefaultSmsPackage context 找到默认的短信包名称 但是如何获取 KitKat 版本之前的包名称呢 请参考这个http androi
  • 在线程之间划分奇数数量

    我刚刚学习 Java 中的线程 我想按字母顺序对单词列表进行排序 我的程序读取 txt 文件中的单词并将它们放入字符串数组中 用户可以自己选择要使用多少个线程 我想将数组分割成均匀 尽可能 的块 线程可以自行排序 所以我的问题是 如何在线程
  • 在父进程退出时杀死子进程

    我对 C 和编程非常陌生 需要一些帮助 在 linux cygwin 上的 c 中 我需要在退出时删除所有子进程 我看过其他类似的问题 但无法使其发挥作用 我试过了 atexit killzombies in parent process
  • 设定百分比内的局部最大识别(不利情况下触发 True)

    寻求识别 标志 True 何时 col1 中的当前值下降到低于 col1 中最近达到的局部最大值设定的百分比 这样就会有多个这样的信号 如达到最大值并且当前值下降设定的百分比 即自动重置 除了百分比之外没有设定阈值 请注意 标志 True
  • 使用 MSBuild 调用设置 AssemblyFileVersion?

    我们有一个基于批处理的构建过程 并且我们仅使用 MSBuild 从 Visual Studio 编译我们的项目文件 我们还将 wix 集成到我们的构建过程中 为了设置软件的版本 我们在主构建脚本中指定了一些在构建过程中使用的环境变量 我的问
  • php 框架中的全局变量开销

    我目前正在开发一个框架 它使用一个对象Core类 此类具有巨大的功能并使框架正常工作 该框架遵循 MVC 架构并具有松散耦合的模型 控制 视图类 这些类需要引用Core课重 到目前为止我所做的是 创建单个对象Core类并通过 PHP 关键字
  • Django REST Framework 和 MongoEngine 的 AttributeError

    我正在尝试将 Django 和 Django REST Framework 与 MongoEngine 一起使用 但它似乎对我不起作用 我不知道哪里出了问题 也许有人可以帮助我 这是代码 模型 py from mongoengine imp
  • 使用 gcc 链接库:参数顺序

    当我将 Ubuntu 发行版升级到 11 10 后 我开始看到 gcc 的奇怪链接器行为 我能够通过移动我的 lgcc 命令末尾的参数 我的问题与中描述的问题类似 这个线程 https stackoverflow com questions
  • 如何在 Kubernetes 中回收 Pod

    我希望在一段时间后 例如每周或每月 从我的部署中优雅地回收我的 Pod 我知道如果我知道 Kubernetes 命令 我可以为此添加一个 cron 作业 问题是在 Kubernetes 中执行此操作的最佳方法是什么 哪个命令可以让我实现这个
  • WCF,自签名加密证书

    我想使用 aspnet 成员身份创建 WCF 服务来授权用户 但是 如果我只需要证书用于加密目的 那么它是自签名证书还是需要从供应商那里购买证书有关系吗 无论您是否对用户进行身份验证 自签名证书都会带来相同的风险 最佳实践是在生产环境中使用
  • ISAPI ZEND url 重写添加额外的“/index.php/”到 url

    我们最近在服务器上重新安装了我们的网站 系统管理员说这是一次精确的重建 在我看来确实如此 但发生了一些不同的事情 我最初并没有开发该网站 那些开发过的网站也不再可用 管理站点的网址现在是 admin site com index php s
  • 如何在模型 ir.actions.server odoo 12 中给出用户组(XML)?

    我使用这个 xml 代码在 操作 内添加一个按钮 但我需要将该按钮限制为某些用户组
  • Objective C:向视图控制器添加加载视图

    在我的应用程序中 我的许多页面都需要一个加载屏幕 如何创建与下面的屏幕截图类似的加载效果 检查 MBProgressHUD https github com jk MBProgressHUD https github com jk MBPr
  • 如何以编程方式更改列表视图高度..?

    我想知道如何以编程方式更改列表视图的高度 是否可以更改单个列表项的子项高度 ViewGroup LayoutParams params listView getLayoutParams params height whatYouWant l
  • 通过Python中的服务帐户访问Google Cloud Storage的权限

    我正在尝试获取一个服务帐户来在 Google Cloud Storage 中创建 blob 来自 Python 脚本 但我遇到了凭据问题 1 我为我的项目创建服务帐户 然后下载 json 格式的密钥文件 home user config g
  • 为什么数组需要 ClassTags 而 List 这样的集合不需要?

    这工作正常 def x A a A List a 没有适用于 A 的 ClassTag def y A a A Array a 但这当然是犹太洁食 def y A ClassTag a A Array a 是什么赋予了 数组在运行时保留其类