我正在考虑关于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()进行转换,但它们都没有用。
这个问题有解决方法吗?它甚至可能吗?
答案 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
}
}