2

我正在查看“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。

4

3 回答 3

2

与将参数传递给两个方法参数的方式相同,您可以将两个类型参数替换为单个类型参数。例如,如果Reducer声明为class Reducer<A, B, C, D>Reducer<Text, IntWritable, Text, IntWritable>则为有效类型。

但是,如果类型参数有不同的约束,例如,不同的superextends约束,您可能无法对两个类型参数使用相同的类型实参。

于 2012-12-05T00:43:18.933 回答
2

Reducer显然键入为<A, B, C, D>. 仅仅因为 A 和 C 碰巧由相同的类型提供并不意味着不可能(据我所知,应该在 C# 中工作)。

编辑:澄清 - 你可以有一个具有多个相同类型参数的方法:public void foo(String a, String b). 人们不会说这是模棱两可的。泛型类型是类的参数,可以以类似的方式使用。想一想Map<String, String>——你可能有一个字符串,它代表一个 ID,指向另一个字符串作为用户名。

于 2012-12-05T00:44:03.270 回答
1

两个Texts 指的是不同的类型参数。例如,如果Reducer有声明

public class Reducer<A, B, C, D> {

然后在 中Reducer<Text, IntWritable, Text, IntWritable>,第一个Text引用类型参数A,第二个引用C- 所以编译器可以区分它们。

于 2012-12-05T00:44:40.530 回答