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,//数 ...
随机推荐
- Linux yum搭建私有仓库
搭建yum仓库需要两种资源: rpm包 rpm包的元数据(repodata) 搭建好仓库后需要使用三种网络协议共享出来 http或https ftp 范例: 使用http协议搭建私有仓库 (本示例使用 ...
- Mysql中的小技巧
1.where 字段名 regexp '正则表达式' 正则符号: ^ $ . [ ] * | . 表示1个任意字符 * 表示前面重复0次,或者任意次 ^ 开始 $ 结尾 [] 范围 | 或 sql示例 ...
- Linux YUM yum 命令详解
Yum命令 常用yum命令列表 command is one of: * install package1 [package2] [...] * update [package1] [package2 ...
- STM32液晶显示HT1621驱动原理及程序代码
1.HT1621电路分析 HT1621为32×4即128点内存映像LCD驱动器,包含内嵌的32×4位显示RAM内存和时基发生器以及WDT看门狗定时器. HT1621驱动电路如下图所示: 图1 与单片机 ...
- 虚拟机安装Centos7.5详细教程
VMware15.5虚拟机安装CentOS7.5详细教程 (前言)软件下载 需要VMware15.5软件和密匙的小伙伴可以从此地址下载:https://pan.baidu.com/s/1A8H ...
- GitHub相关资料&&可以参加的开源项目
GitHub相关的资料 有不懂的地方时可以看GitHub Docs. GitHub tutorial GitHub glossary GitHub的字典,可以看到里面特定的概念. All about ...
- idea 生成方法注释
/* * * @description: * @author: xuetong.yang * @date: $date$ $time$ $params$ * @return: $return$ */ ...
- 05 MySQL_主键约束
主键约束 主键: 用于表示数据唯一性的字段称为主键: 约束:就是对表字段添加限制条件 主键约束:保证主键字段的值唯一且非空: - 格式 : create table t1(id int primary ...
- FPS游戏逆向-方框透视(三角函数)
本套课程主要学习FPS类游戏安全 由于FPS类游戏本身的特性问题,可能产生一些通用的游戏安全问题 在通过逆向与正向对FPS类游戏分析之后,找到其可能出现的不安全点 才能更好的保护游戏不被外部力量侵犯 ...
- 2022.7.19 $\mathcal{S\,\,T\,L}$
\(STL\) 容器的共有特征:.begin() .end()//表示最后一个元素的后面那个位置 .size()//无符号整型 .swap(b) ::iterator//迭代器 关于迭代器 迭代器可以 ...