如何将List <t>转换为能够在各个对象上调用特定方法?</t>

时间:2011-08-08 12:47:54

标签: java generics casting generic-list

我正在考虑关于List的通用转换,但老实说,我不知道是否可以实现。

我的应用程序中有这段代码

public String getObjectACombo() {
   List<ObjectA> listA = theDAO.getObjectA();
   String combo = getCombo(listA, "rootA"); // --> This line
}

public String getObjectBCombo() {
   List<ObjectB> listB = theDAO.getObjectB();
   String combo = getCombo(listA, "rootA"); // --> This line
}

首先,我正在编写一些例行程序,提到“ - &gt;这一行”。但是这两种方法具有完全相同的算法,可以从List&lt;?&gt;生成JSON字符串。已从数据库返回。所以我想用通用方法getCombo(List&lt; T&gt; list,String root)替换它们。但问题是我无法做到这一点。

public <T> String getCombo(List<T> list, String root) {
   Iterator<T> listItr = list.iterator();

   ...
   while ( listItr.hasNext() ) {
      jsonObj.put(list.get(i).toJson());  // --> The Error line
   }
}

“错误行”发生错误。 ObjectA.java和ObjectB.java都包含toJson()方法,但是“方法toJson()未定义为上述行的类型T”。

我尝试使用(T)和Class.forName()进行转换,但它们都没有用。

这个问题有解决方法吗?它甚至可能吗?

2 个答案:

答案 0 :(得分:6)

使用定义toJson()方法的界面,例如Jsonable :) - 然后限制T

public <T extends Jsonable> String getCombo(List<T> list, String root) { 
 ...
}

这样编译器知道每个T必须从Jsonable继承,因此具有toJson()方法。

编辑:这是我的意思的一个例子,使用现有的Comparable<T>界面:

public <T extends Comparable<T>> boolean compare(List<T> list, T other) {
  for( T object : list ) {
    if( object.compareTo( other ) == 0 ) {
      return true;
    }
  }    
  return false;
}

compare( new ArrayList<String>(), "foo"); //compiles, since String implements Comparable<String>
compare( new ArrayList<Object>(), null); //doesn't compile, since Object doesn't implement Comparable<Object>

答案 1 :(得分:0)

尝试为每个人使用a:

public <T> String getCombo( List<T> list, String root )
{
    for (T x : list)
    {
        //do stuff here
    }
}