【问题标题】:Java generics holding same type of parameters more than onceJava 泛型多次持有相同类型的参数
【发布时间】:2017-05-05 09:34:48
【问题描述】:

我正在学习 hadoop map-reduce 算法,我是 java 泛型概念的新手,我能够理解泛型对于使用引用类型创建的对象可以做什么(类型转换)。但不明白为什么 same parameter type 在 大括号内声明了不止一次。

下面是一个reducer类定义,它实现了Reducer接口,类型声明为。为什么不能单独作为?

public static class T_Reduce extends MapReduceBase implements 
Reducer< Text, IntWritable, Text, IntWritable > 
{  

   public void reduce( Text key, Iterator <IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException 
     { 
        ......
        ......
     } 
} 

我用谷歌搜索了很多,但找不到一个简单的正确答案。

【问题讨论】:

  • 简短回答:用于输入键、输入值、输出键、输出值类型。输入和输出类型可以不同。因此,您需要 4 个参数。

标签: java hadoop generics mapreduce


【解决方案1】:

Reducer 的 JavaDoc 完全指定了 like 类型的签名

org.apache.hadoop.mapreduce
     Class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>

这表明前两个参数是 reduce 函数输入的键和值类型 - 而第二对是 输出 类型。在这里,它们是相同的,但并不要求它们适用于所有可能的用例。例如,您可能正在通过 int 上的计算生成 double。

【讨论】:

    【解决方案2】:

    因为Reducer 可以采用四种不同的类型。在你的情况下,它没有,但功能仍然存在,编译器不会知道最后两种类型是什么:

    Reducer<Text, IntWritable, ?, ?>
    

    【讨论】:

      【解决方案3】:

      您是否检查过Reducer 的声明?我的猜测是它被声明为Reducer&lt;T,U,V,W&gt;,所以你必须参数化所有类型,即使它们中的一些是相同的。

      【讨论】:

        【解决方案4】:

        Reducer&lt;Text, IntWritable, Text, IntWritable&gt; 是Reducer&lt;K2, V2, K3, V3&gt; 的特化。该接口不要求K2 和K3 为同一类型。因此它不能重用密钥类型的参数。因此专业化也不能。

        【讨论】:

          猜你喜欢
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-18
          • 1970-01-01
          • 2018-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多