2

HadoopのHelloWorldの例である「WordCount」を見ています。これには次のメソッドが含まれています。

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のインスタンスが2つあり、コンパイラーは引数を適切にマップする方法を知らないため、署名は許可されません。

誰かがこのなじみのない構文を説明できますか?

編集:これはジェネリックスの例ですが、この形式では、使用される実際の型が宣言で設定されています。クラスReduceはジェネリックではありませんが、Reducerはジェネリックであり、パラメーターA、B、C、およびDを設定しています。

4

3 に答える 3

2

Reducerのようにタイプされているよう<A, B, C, D>です。A と C がたまたま同じ型によって提供されているからといって、それが不可能になるわけではありません (私の知る限り、C# で動作するはずです)。

編集:明確にするために-同じタイプのパラメーターを複数持つメソッドを使用できます: public void foo(String a, String b)。これが曖昧であるとは言えません。ジェネリック型はクラスのパラメーターであり、同様の方法で使用できます。考えてみてくださいMap<String, String>-ユーザー名として別の文字列を指すIDを表す1つの文字列がある場合があります。

于 2012-12-05T00:44:03.270 に答える
2

引数を 2 つのメソッド パラメーターに渡すのと同じ方法で、2 つの型パラメーターを 1 つの型引数で置き換えることができます。たとえば、Reducerが として宣言されている場合class Reducer<A, B, C, D>Reducer<Text, IntWritable, Text, IntWritable>は有効な型です。

ただし、型パラメーターに異なる制約 (異なるsuperandextends制約など) がある場合、両方の型パラメーターに同じ型引数を使用できない場合があります。

于 2012-12-05T00:43:18.933 に答える
1

2 つTextの s は、異なる型パラメーターを参照します。たとえばReducer、宣言があった場合

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

ではReducer<Text, IntWritable, Text, IntWritable>、最初Textは型パラメーターを参照しA、2 番目はC- を参照するため、コンパイラーはそれらを区別できます。

于 2012-12-05T00:44:40.530 に答える