我有这种测试方法:
public void load(Class<? extends Object> className, XXXX)
{
Criteria criteria = session.createCriteria(className);
List<Object> list = criteria.list();
for (Object item : list)
{
list.add(new Object(item.getId, item.getCode); /* Object doesn't know getId */
}
}
如何在load方法中替换XXXX以使用具体的Object
来调用它?类似的东西:
load(Foo.class, testObject)
有可能吗?
答案 0 :(得分:4)
每个泛型类型都必须扩展Object,所以这就足够了:
public <T> void load(Class<T> className, T object)
{
// snip...
}
答案 1 :(得分:3)
public <X> void load(Class<X extends Object> className, X object)
我认为这就是你的意思。
答案 2 :(得分:2)
这应该有用。
public <T extends Base> void load(T object){
Criteria criteria = session.createCriteria(object.class);
List<T> list = criteria.list();
for (T item : list)
{
System.out.println(item.getId)); /* Object doesn't know getId */
}
}
参数化void允许您使用泛型。由于您正在寻找T的实例,并且尚未定义T,因此当您将对象传递给load(T对象)时,它将自动将T设置为对象所属的任何类。它会自动参数化空白。
泛型非常有用。例如,它在List和Set类以及Map中使用。然而,他们有自己的风险。如果你没有放置T extends Base或某个类,那么你将得到编译错误,因为java无法确定传递的类是否具有getId。设置一个必须继承的类将确保该对象必须知道该方法。
将Base替换为知道“getId”的基类,并使所有其他类甚至可以最终传入load()扩展该类。请注意,不需要将类传递给load(),因为我们只会使用对象的类,这具有相同的效果。