传递参数Object

时间:2011-10-29 20:10:51

标签: java

我有这种测试方法:

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)

有可能吗?

3 个答案:

答案 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(),因为我们只会使用对象的类,这具有相同的效果。

相关问题