我正在查看“WordCount”,这是Hadoop的hello world示例,它包含以下方法:
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
我必须误解我在读什么。我把它读作一个名为Reduce的泛型类,它扩展了基类Reducer,带有一些泛型类型。来自C#,不允许签名,因为有两个Text实例,编译器不知道如何正确映射参数。
有人可以解释这种不熟悉的语法吗?
编辑: 这是泛型的一个例子,但是,在这种形式中,要使用的实际类型已在声明中设置。 Reduce类不是通用的,但是Reducer是,我们设置了参数A,B,C和D.
答案 0 :(得分:2)
与将参数传递给两个方法参数的方式相同,可以用单个类型参数替换两个类型参数。例如,如果Reducer
被声明为class Reducer<A, B, C, D>
,则Reducer<Text, IntWritable, Text, IntWritable>
是有效类型。
但是,如果类型参数具有不同的约束,例如,不同的super
和extends
约束,则可能无法对两个类型参数使用相同的类型参数。
答案 1 :(得分:2)
Reducer
显然是<A, B, C, D>
。仅仅因为A和C碰巧由同一类型提供并不会使它变得不可能(据我所知,它应该在C#中工作)。
编辑:澄清 - 您可以拥有一个方法,其中包含多个相同类型的参数:public void foo(String a, String b)
。人们不会说这是模棱两可的。通用类型是类的参数,可以以类似的方式使用。想象一下Map<String, String>
- 您可能有一个字符串表示指向另一个字符串的ID作为用户名。
答案 2 :(得分:1)
两个Text
引用不同的类型参数。例如,如果Reducer
有声明
public class Reducer<A, B, C, D> {
然后在Reducer<Text, IntWritable, Text, IntWritable>
中,第一个Text
将引用类型参数A
,第二个引用C
- 因此编译器可以区分它们。