这是java泛型,这怎么可能有效?

时间:2012-12-05 00:40:28

标签: java generics

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 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 - 因此编译器可以区分它们。