如何将java.lang.Class <mapper>强制转换为java.lang.class <tablemapper> </tablemapper> </mapper>

时间:2011-09-23 18:49:56

标签: java hadoop hbase

请参阅底部的解决方案。

我正在尝试编写一些通用处理代码,但在其中一个子类中,它需要一个更具体的Class。

所以基类作为Class类型的字段,并且在子类中我试图将该Class对象转换为类型Class,它是org的子类.apache。hadoop.hbase.mapreduce.Mapper

我从Netbeans收到以下错误:

"Incompatible types
required: java.lang.Class<org.apache.hadoop.hbase.mapreduce.TableMapper>
found: java.lang.class<capture#3 of ? extends org.apache.hadoop.mapreduce.Mapper>"

当我尝试以下代码时

Class<TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = TableMapper.class.asSubclass(mapperClass);

    //do stuff
}

我得到了:

incompatible types
required: java.lang.Class<org.apache.hadoop.hbase.mapreduce.TableMapper>
found: java.lang.Class<capture#8 of ? extends org.apache.hadoop.hbase.mapreduce.TableMapper>

Class<TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = mapperClass.asSubclass(TableMapper.class);

    //do stuff
}

好的,得到了​​我的同事的答案,看起来应该可行:

Class<? extends TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = mapperClass.asSubclass(TableMapper.class);

    //do stuff
}

1 个答案:

答案 0 :(得分:2)

如果要将类分配给实际上是TableMapper的子类的 tableMapperClass ,则需要更改变量的类型。相反,使用:

Class<? extends TableMapper> tableMapperClass = null;

现在您可以将TableMapper.class或任何子类分配给此变量。当你写Class<TableMapper>时,你承诺变量将完全是TableMapper.class或null。

另一个例子:

Class<Number> number = Integer.class; // does not compile
Number number = new Integer(1); // compiles fine
Class<? extends Number> number = Integer.class; // also ok

请注意,您可以使用Class<Number>执行不同的操作,然后使用Class<? extends Number>。例如,您可以调用Class<Number>的构造函数,因为您知道该类。您无法使用Class<? extends Number>执行此操作,因为构造函数未在编译时定义。

List<Number> vs List<? extends Number>类似。您可以在List<Number>类型的变量上调用list.add(7),但不能在List<? extends Number>上执行此操作,因为您不知道第二个列表的类型。例如,它可能是List<Double>,在这种情况下,不允许添加整数。

泛型很奇怪。 :)希望这有帮助。