首页 / JAVA / Java泛型问题(带有Spring)
Java泛型问题(带有Spring)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型问题(带有Spring),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1844字,纯文字阅读大概需要3分钟。
内容图文
![Java泛型问题(带有Spring)](/upload/InfoBanner/zyjiaocheng/790/708124e06a234fe5813671f0ea7b03c6.jpg)
我想我可能是类型擦除的受害者,但我想先在这里与其他人核对.
我有要求做这样的事情:
public interface FooFactory {
public <T extends Bar> Foo<T> createFoo( Class<T> clazz );
}
编写此代码完全有效.但是,我正在尝试使用Spring BeanFactory实现此功能,但我不能这样做.
我想做的是……
public class FooFactoryImpl implements BeanFactoryAware {
private BeanFactory beanFactory;
public <T extends Bar> Foo<T> createFoo( Class<T> clazz ) {
return beanFactory.getBean( ????????? );
}
public void setBeanFactory( BeanFactory beanFactory ) {
this.beanFactory = beanFactory;
}
}
如你所见,我已经投入了????????我想要检索Foo< T>类型的bean,其中T扩展Bar.然而,不可能导出类型为Foo< T>的Class对象.所以我认为我想做的事情是不可能的?
还有其他人看到这种方式或实现我正在尝试做的事情的另一种方式吗?
谢谢,
安德鲁
解决方法:
由于您无法定义类型为Foo< T>的bean.在Spring上下文中使用专门的T,我猜你实际上有Foo< T>的子类:
abstract public class Foo<T> { ... }
public class FooString extends Foo<String> { ... }
public class FooInteger extends Foo<String> { ... }
–
<bean id = "fooInteger" class = "FooInteger" />
<bean id = "fooString" class = "FooString" />
在这种情况下,您可以使用类型参数不会从超类定义中删除的事实:
public class FooFactory implements ApplicationContextAware {
private Map<Class<?>, Foo<?>> beans = new HashMap<Class<?>, Foo<?>>();
@SuppressWarnings("unchecked")
public <T> Foo<T> createFoo(Class<T> c) {
return (Foo<T>) beans.get(c);
}
@SuppressWarnings("unchecked")
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
Collection<Foo> candidates = ctx.getBeansOfType(Foo.class).values();
for (Foo candidate: candidates) {
Type superclass = candidate.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType) {
ParameterizedType t = (ParameterizedType) superclass;
Class<?> p = (Class<?>) t.getActualTypeArguments()[0];
beans.put(p, candidate);
}
}
}
}
内容总结
以上是互联网集市为您收集整理的Java泛型问题(带有Spring)全部内容,希望文章能够帮你解决Java泛型问题(带有Spring)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。