java scala,java与scala的区别
错误码:写java和scala混合代码的时候遇到了一个小问题。
def extractRefInputFieldsWithType(exprs:JList[rex node]):Array[(Int,RelDataType)]={
val visitor=new InputRefVisitor
//从表达式中提取引用的输入字段
exprs.foreach(_。接受(访问者))
visitor.getFieldsWithType
}最终scala。Tuple2整数,RelDataType [] refFields=
rexnode extractor . extractrefinputfieldswithtype(project . get projects());
IDE提示的错误是返回的类型是Tuple2 Object,RelDataType,但是我们承接的类型是tuple2onteger,reldatatype。
本质原因是scala中的Int和java中的Integer没有对齐。
从这个api介绍https://www.scala-lang.org/api/current/scala/Int.html,我们可以知道scala中的int是一个value类(继承自AnyVal),有点类似于java中新提案中的值类型。它可以使用户定义的类型无需装箱和解包即可运行,并且可以减少不必要的堆内存分配。
从栈溢出看到这样一个测试样本。
class SomeClass {
def testIntTuple: (Int,Int)=(0,1)
def testinteger tuple:(Java . lang . integer,java.lang.Integer)=(0,1)
def testin Array:Array[Int]=Array(1,2)
}javap SomeClass
从 IntValue.scala 编译
public class org . Apache . flink . table . planner . plan . stream . SQL . some class {
公共scala。Tuple2 java.lang.Object,Java . lang . object testint tuple();
公共scala。Tuple2 java.lang.Integer,Java . lang . integer testinteger tuple();
public int[]testin array();
public org . Apache . flink . table . planner . plan . stream . SQL . some class();
}通过反编译的代码可以看出,运行时表示的类型是Object type,而如果直接返回的类型是Array[Int],对应表示的类型是int[]
从上面的描述可以看出,因为Int类型是value class,所以在运行时并不直接对应java.lang.Integer。因为value类的语义是在scala中实现的,所以不需要转换成wrapper类,这样可以获得更好的性能,避免了创建int值时在堆上分配内存和创建引用的需要。
所以去java类/和java泛型参数的时候没有直接的引用类型映射,但是去array的时候可以直接表示为基元array int[]
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。