我有一个看起来(原则上)像这样的功能
public <T extends Listener> T createListener(Class<T> clazz) {
if (clazz == SpecificListener.class) {
return (T) new SpecificListener();
}
// more instantiations here
}
使用SpecificListener作为接口Listener的实现。此代码有效,但return语句执行未经检查的转换为T.
有没有更好的方法来编写它而不进行未经检查的转换?
答案 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();
}