Java访问Scala中的Int类型
出错代码
写java 和 scala 混合代码的时候遇到一个小问题
def extractRefInputFieldsWithType(exprs: JList[RexNode]): Array[(Int, RelDataType)] = {
val visitor = new InputRefVisitor
// extract referenced input fields from expressions
exprs.foreach(_.accept(visitor))
visitor.getFieldsWithType
}
final scala.Tuple2<Integer, RelDataType>[] refFields =
RexNodeExtractor.extractRefInputFieldsWithType(project.getProjects());

IDE提示的错误是返回的类型是 Tuple2<Object, RelDataType> 但是我们承接的类型是Tuple2<Integer, RelDataType>
原因
这本质原因是因为scala中的Int和java的Integer并不对标。
从这个 api介绍中https://www.scala-lang.org/api/current/scala/Int.html我们可以知道scala中Int是一个value class (继承自 AnyVal) 有点类似java中的新提案中的 value types,可以让用户定义的类型在运行时不需要装箱拆箱操作,可以减少不必要的堆内存分配。
从Stack Overflow上看到这样的测试样例
class SomeClass {
def testIntTuple: (Int, Int) = (0, 1)
def testIntegerTuple: (java.lang.Integer, java.lang.Integer) = (0, 1)
def testIntArray: Array[Int] = Array(1, 2)
}
javap SomeClass
Compiled from "IntValue.scala"
public class org.apache.flink.table.planner.plan.stream.sql.SomeClass {
public scala.Tuple2<java.lang.Object, java.lang.Object> testIntTuple();
public scala.Tuple2<java.lang.Integer, java.lang.Integer> testIntegerTuple();
public int[] testIntArray();
public org.apache.flink.table.planner.plan.stream.sql.SomeClass();
}
通过反编译之后的代码可以看到运行时表示的类型是Object类型,而如果直接返回的类型是Array[Int] 则相应的表示的类型是int[]

从上面这段描述可以看到,因为Int类型是value class 所以在运行时并不直接对应到java.lang.Integer 因为scala中实现了value class的语义,所以他不需要将其转化成包装类,这样就可以获得更好的性能,避免创建Int值时还需要堆上分配内存和创建引用。
因此转到java class时/或者java的泛型参数时就没有直接的Reference类型映射,而转到数组时,就可以直接表示为 primitive 数组int[]
参考
https://stackoverflow.com/questions/10248180/scala-tuple-type-inference-in-java
https://scala.cool/2017/07/scala-types-of-types-part-4/#17-value-%E7%B1%BB
https://docs.scala-lang.org/overviews/core/value-classes.html value class 介绍
https://www.jesperdj.com/2015/10/04/project-valhalla-value-types/ java value types
https://openjdk.org/projects/valhalla/ jep
Java访问Scala中的Int类型的更多相关文章
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- Programming In Scala笔记-第五章、Scala中的变量类型和操作
这一章的一些基础性的东西,主要包括Scala中的基本变量类型,以及相关的一些操作符. 一.简单类型 下表中列出Scala语言中的基本类型,以及其字节长度,其中Byte, Short, Int, Lon ...
- Scala进阶之路-Scala中的高级类型
Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...
- Akka系列(五):Java和Scala中的Future
前言....... 随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue ...
- java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型
经常在写Rdd的时候, 如: val OWNER_ID=row.getAs("OWNER_ID") 等, 运行是可能会报异常 : java.lang.String cannot ...
- Java对于表达式中的自动类型提升
1 表达式中的自动类型提升: 表达式求值时,Java自动的隐含的将每个byte.short或char操作数提升为int类型,这些类型的包装类型也是可以的. 例如: short s1 = 1; s1 = ...
- 【java】jackson 中JsonFormat date类型字段的使用
为了便于date类型字段的序列化和反序列化,需要在数据结构的date类型的字段上用JsonFormat注解进行注解具体格式如下 @JsonFormat(pattern = "yyyy-MM- ...
- java获取MySQL自动的int类型的Id
@Resource(name = "dashboardTemplate") protected JdbcTemplate systemJDBCTemplate; //这个是Dao里 ...
- 时间、金钱在java、数据库中的变量类型之总结
在编写程序时,总是有些变量的类型搞不很明白,现将目前涉及到的变量总结一下: 1.“时间”类型 (1).在数据库中的变量类型是:DateTime 比如: operateTime DATETIME,//数 ...
随机推荐
- colab运行.py文件
!python split_data.py
- 让你的Nginx支持分布式追踪
Background NGINX 是一个通用且流行的应用程序.也是最流行的 Web 服务器,它可用于提供静态文件内容,但也通常与其他服务一起用作分布式系统中的组件,在其中它用作反向代理.负载均衡 或 ...
- 从 1.5 开始搭建一个微服务框架——日志追踪 traceId
你好,我是悟空. 前言 最近在搭一个基础版的项目框架,基于 SpringCloud 微服务框架. 如果把 SpringCloud 这个框架当做 1,那么现在已经有的基础组件比如 swagger/log ...
- CentOS7使用LVM缩减/home空间,扩大/空间
CentOS7使用LVM缩减/home空间,扩大/空间方法:把/home里的内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/文件系统.新建/home,恢复/home的原内容1.查看默认分区[ ...
- mesi--cpu内存一致性协议
目录 cpu缓存一致性问题 mesi协议 mesi协议4种状态,及状态转换 模拟工具演示 cpu缓存一致性问题 一个服务器中有多个核,每个核中有多个cpu,每个cpu有多个线程.缓存最少分为3级,1级 ...
- 2019 CSP-S 初赛解析
因为我不会设置用博客园显示Markdown语法,所以在洛谷也写了一份:传送门 一起讨论的这套卷.题干 然后还有一些可以借鉴一下的解析 选择: T1. 注意运算顺序: a%3=1 --> (int ...
- ReentrantLock源码详解
前言 以前只知道ReentrantLock底层基于AQS实现,相对于(旧版本的)synchronized: 更轻量(基于CAS而不是管程),由JDK实现 可以实现公平/非公平 可中断等待 可绑定多个条 ...
- windows10 使用elasticsearch和kibana
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip https:// ...
- 解决报错ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code
问题的由来 MySQL服务没有正常关机,是电脑没电后自动关机产生,记录一下排查过程 1.本以为是pid的问题,上网找了教程,解决不了,然后看日志看了网上各种说是数据库内存溢出 2021-03-12T1 ...
- CodeQL使用流程
前言 好久没用CodeQL了,看了自己之前写的文章发现竟然没有做过相关记录 然后就不知道怎么用了hhh 使用流程 0x1 生成数据库 我们拿到一套源码,首先需要使用CodeQL生成数据库 执行命令: ...