首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将java.lang.Class<Mapper>转换为java.lang.class<TableMapper>

如何将java.lang.Class<Mapper>转换为java.lang.class<TableMapper>
EN

Stack Overflow用户
提问于 2011-09-24 02:49:56
回答 1查看 618关注 0票数 1

有关解决方案,请参阅底部。

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

所以基类是一个类类型的字段,在子类中,我试图将这个类对象转换为类型,它是org.​apache.​hadoop.​hbase.​mapreduce.Mapper的一个子类。

我从Netbeans中得到以下错误:

代码语言:javascript
复制
"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>"

当我尝试以下代码时

代码语言:javascript
复制
Class<TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = TableMapper.class.asSubclass(mapperClass);

    //do stuff
}

我得到了:

代码语言:javascript
复制
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>

代码语言:javascript
复制
Class<TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = mapperClass.asSubclass(TableMapper.class);

    //do stuff
}

好了,我从我的同事那里得到了答案,看起来这应该是可行的:

代码语言:javascript
复制
Class<? extends TableMapper> tableMapperClass = null;
if( mapperClass.equals(TableMapper.class) ) {
    tableMapperClass = mapperClass.asSubclass(TableMapper.class);

    //do stuff
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-24 03:26:34

如果您想将一个类分配给实际上是TableMapper的子类的tableMapperClass,那么您需要更改变量的类型。取而代之的是:

代码语言:javascript
复制
Class<? extends TableMapper> tableMapperClass = null;

现在,您可以将TableMapper.class或任何子类赋值给此变量。当您编写Class<TableMapper>时,您承诺变量将精确为TableMapper.class或null。

另一个例子:

代码语言:javascript
复制
Class<Number> number = Integer.class; // does not compile
Number number = new Integer(1); // compiles fine
Class<? extends Number> number = Integer.class; // also ok

请注意,与使用Class<? extends Number>相比,使用Class<Number>可以做不同的事情。例如,您可以调用Class<Number>的构造函数,因为您知道该类。使用Class<? extends Number>不能做到这一点,因为构造函数不是在编译时定义的。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7533511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档