这是一个通用的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希望我在这里做什么?
答案 0 :(得分:1)
您的Context
课程是内部课程。因此,任何Context
值都与其封闭类型Reducer
的实例相关。该关系包括泛型类型参数。
非原始类型表达式是
@Mock
private Reducer<?, ?, ?, ?>.Context context;
但你应该适当地参数化它。如果这不是您的意图(以这种方式链接它们),请创建Context
static
或将其声明为顶级课程。
忽略Reducer
,因为它是Hadoop代码库的一部分。