2016-04-13 10 views
1

これは一般的なJavaの質問ですが、特にHadoop 2.6への依存のために苦労しています。ジェネリッククラスの内部クラスを使う

私のようなルックスで動作するようにしようとしている外部コード:

package org.apache.hadoop.mapreduce; 

public class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT> { 

    public abstract class Context 
    implements ReduceContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> { 
    } 
} 

そして、私自身のコードは、私はその私が」することができます。このコードで、コンパイラ警告が表示されます

import org.apache.hadoop.mapreduce.Reducer.Context; 

public class MyReducerTest { 

    @Mock 
    private Context context; 
} 

のように見えますそれを抑えることの不足を取り除くようだ。

Reducer.Context is a raw type. References to generic type 
    Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>.Context should be parameterized 

私が何をすべきかを見つけるためにしようとするたびに、答えは違ったクラス・パラメータを使用して、ネストされたクラスの構造を変更することを中心に展開しているようです。しかし、Hadoopのコードを変更することは選択肢ではない(チームの制約のために2.6からアップグレードすることもない)。

私は

import org.apache.hadoop.mapreduce.Reducer<?,?,?,?>.Context; 

public class MyReducerTest {  
    @Mock 
    private Context<?,?,?,?> context; 
} 

を試みたが、これらの原因のコンパイルエラーました。私は警告を抑止したり無視したりすることができますが、それらのオプションはそれぞれの理由で悪いです。

ここでJavaは私に何をしたいのですか?

+1

なぜ 'Context'は内部クラスですか? – Savior

答えて

1

Contextクラスは内部クラスです。したがって、Contextの値は、その囲みタイプのインスタンスであるReducerに関連しています。その関係にはジェネリック型パラメータが含まれます。

非生型の式は

@Mock 
private Reducer<?, ?, ?, ?>.Context context; 

あるしかし、あなたはおそらく適切にパラメータ化する必要があります。これが(この方法でリンクする)あなたの意図でない場合は、Contextstaticとするか、最上位クラスとして宣言してください。

Reducerの場合は無視されます。これはHadoopコードベースの一部なので無視してください。

関連する問題