Java中的通配符不适用于Spark cogroup函数

时间:2017-06-07 14:02:25

标签: java oop generics inheritance apache-spark

我正在尝试在java中组合两个RDD,其中一个RDD v2 的类型如下:JavaPairRDD<Key, ? extends Value>(实际上它是用? extends定义的,因为它是一个功能参数)。

然后当我把它们组合起来时,比如:

void f(JavaPairRDD<Key, ? extends Value> v2){
    TYPE v = v1. cogroup(v2);
    // ERROR. I cannot get the correct type for this cogroup function
}

编译器抱怨,因为当我尝试从此cogroup函数获取返回值时,它无法推断出v2的类型。

有趣的是,如果我不关心返回的值,只需致电:

v1.cogroup(v2).collectAsMap();

看起来很有效。至少它可以编译。

当java在函数参数中被定义为通配符时,似乎只能接受通配符(如)作为参数。我是对的吗?

我想问一下是否有另一种方法可以正确地做到这一点?或者也许我不应该这样做,这里究竟出现了什么问题?

非常感谢。

1 个答案:

答案 0 :(得分:1)

似乎java只能在函数参数中定义为通配符时接受通配符(如?extends Base)作为参数。

cogroup是在scala中定义的,因为scala的类型系统支持共变量继承,它的接口不包含java的键向扩展

  def cogroup[W](other: JavaPairRDD[K, W]): JavaPairRDD[K, (JIterable[V], JIterable[W])] =
    fromRDD(cogroupResultToJava(rdd.cogroup(other)))

但是在Java中,如果函数签名中的参数没有通配符,则调用它时的参数不能是定义为通配符的某种类型。