java scala,java与scala的区别

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: