1.24
元组 tuple
java代码中使用scala元组(TupleN)实例时尽量通过方法调用(._1()
)访问元素,避免字段访问元素(._1
),因为在元组类型参数全是基本类型(实质是Tuple2类声明时定义的特例化@specialized类型)时,通过字段访问到的值是null,通过方法能正确获取值。另外,scala声明的类型参数为AnyVal(非java class/interface类型,几乎对应java基本数据类型)的泛型在java代码看来其类型参数是Object(比如scala中参为Int的泛型在java看来不是java.lang.Integer,而是Object)。
/* scala
class STest {
def int_long(): (Int, Long) = (1, 2L)
def int_string: (Int, String) = (1, "abc")
}
*/
public class AppMain {
public static void main(String[] args) throws Exception {
// Tuple2<Object,Object> intLong = int_long();
// can NOT: Tuple<Integer,Long> intLong = int_long();
Tuple2<?, ?> intLong = new STest().int_long();
System.out.println("intLong._1 = " + intLong._1);
System.out.println("intLong._1() = " + intLong._1());
System.out.println("intLong._2 = " + intLong._2);
System.out.println("intLong._2() = " + intLong._2());
System.out.println();
// Tuple2<Object, String> intStr;
Tuple2<?, ?> intStr = new STest().int_string();
System.out.println("intStr._1 = " + intStr._1);
System.out.println("intStr._1() = " + intStr._1());
System.out.println("intStr._2 = " + intStr._2);
System.out.println("intStr._2() = " + intStr._2());
}
}
/* output
intLong._1 = null
intLong._1() = 1
intLong._2 = null
intLong._2() = 2
intStr._1 = 1
intStr._1() = 1
intStr._2 = abc
intStr._2() = abc
*/