【发布时间】:2017-11-08 22:31:26
【问题描述】:
我正在尝试在 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才能接受通配符(如)作为参数。我说的对吗?
我想问是否有另一种方法可以正确地做到这一点?或者也许我不应该这样做,这里到底出了什么问题?
非常感谢。
【问题讨论】:
-
TYPE 与 Value 有何关系?为什么你不能只使用
<Key, Value> -
对不起,我没有说清楚。 TYPE 是 cogroup 函数返回值的类型。 I 和 IntelliJ :D 都无法推断调用 v1.cogroup(v2) 的返回类型。
-
哦,所以这是泛型失败。如果您使用 Object 而不是 TYPE,它应该可以工作。你能包括 cogroup 的函数定义吗? (抽象函数版本)这就是为什么我可以看到编译器试图返回的内容。
标签: java oop generics inheritance apache-spark