使用泛型类的内部类

时间:2016-04-13 00:49:22

标签: java hadoop

这是一个通用的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 个答案:

答案 0 :(得分:1)

您的Context课程是内部课程。因此,任何Context值都与其封闭类型Reducer的实例相关。该关系包括泛型类型参数。

非原始类型表达式是

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

但你应该适当地参数化它。如果这不是您的意图(以这种方式链接它们),请创建Context static或将其声明为顶级课程。

忽略Reducer,因为它是Hadoop代码库的一部分。