0

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

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

特定侦听器是接口侦听器的实现。此代码有效,但 return 语句会未经检查地转换为 T。

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

4

3 回答 3

3

检查的转换将是clazz.cast(new SpecificListener()).

于 2013-04-02T16:08:57.770 回答
1

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

public <T extends Listener> T createListener(Class<T> clazz) {
  if (clazz == SpecificListener.class) {
    return clazz.cast(new SpecificListener());
  }
}
于 2013-04-02T16:09:51.710 回答
1

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

public <T extends Listener> T createListener(Class<T> clazz)
throws InstantiationException, IllegalAccessException {
    return clazz.newInstance();
}
于 2013-04-02T16:13:20.570 回答