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

标签 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只能在函数参数中定义为通配符时才接受通配符(如)作为参数。我说得对吗?

请问有没有其他方法可以正确的做?或者也许我不应该这样做,这里到底出了什么问题?

非常感谢。

最佳答案

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

cogroup是在scala中定义的,由于scala的类型系统支持协变继承,其接口(interface)不包含java的keyward extends

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

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

关于java - Java 中的通配符不适用于 Spark cogroup 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414878/

相关文章:

java - 应用程序 :transformClassesWithDesugarForMockDebug using Android Studio 3 canary 1

java - 如何根据从数据库中获取的数据一般地构造对象

java - 为什么不能分配 I <?将类型> 扩展到 <类型>?

java - 如何将 String 转换为 Java.util.Date 包括 ISO8601

java - 填写缺失数据的简单方法

java - 我们可以创建一个接口(interface)对象吗?

javascript - CoffeeScript 中的继承实现

java接口(interface)泛型转换问题

c# - 泛型的奇怪使用

java - CSV 与 JSON 比较