在实例化特定的Class <t> </t>时正确处理转换

时间:2013-04-02 16:07:32

标签: java generics

我有一个看起来(原则上)像这样的功能

public <T extends Listener> T createListener(Class<T> clazz) {
  if (clazz == SpecificListener.class) {
    return (T) new SpecificListener();
  }
  // more instantiations here
}

使用SpecificListener作为接口Listener的实现。此代码有效,但return语句执行未经检查的转换为T.

有没有更好的方法来编写它而不进行未经检查的转换?

3 个答案:

答案 0 :(得分:3)

选中的转化为clazz.cast(new SpecificListener())

答案 1 :(得分:1)

是的,您可以使用Class#cast(Object obj)方法。

public <T extends Listener> T createListener(Class<T> clazz) {
  if (clazz == SpecificListener.class) {
    return clazz.cast(new SpecificListener());
  }
}

答案 2 :(得分:1)

如果您可以实例化的所有侦听器都提供了一个无效的构造函数,您可以简单地尝试:

public <T extends Listener> T createListener(Class<T> clazz)
throws InstantiationException, IllegalAccessException {
    return clazz.newInstance();
}