我正在尝试在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在函数参数中被定义为通配符时,似乎只能接受通配符(如)作为参数。我是对的吗?
我想问一下是否有另一种方法可以正确地做到这一点?或者也许我不应该这样做,这里究竟出现了什么问题?
非常感谢。
答案 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中,如果函数签名中的参数没有通配符,则调用它时的参数不能是定义为通配符的某种类型。