按照惯例(也不知道哪来的惯例),先上代码:
package com.tongdatech.winterspring.cwgx.utils;
import java.util.ArrayList;
import java.util.List;
import com.ld.ClassA;
/**
*
* @author ld
* 数据转成tree供页面展示
*
*/
public class TreeTableSunYi {
public static <E extends ClassA> List<E> toTreeData(List<E> lists, int pId) {
List<E> tVos = new ArrayList<>();
for(E tVo : lists) {
int parentId = tVo.getParentRowNumber();
int id = tVo.getRowNumber();
if(pId == parentId) {
List<E> lossPosts = toTreeData(lists, id);
if(lossPosts.size() > 0) {
tVo.setChildren(lossPosts);
}
tVos.add(tVo);
}
}
return tVos;
}
}
如上,是一个递归,把数据转成tree的方法。
在代码中,我们在写方法的时候,通过“<E extends ClassA>”定义泛型类E,当然这个E可以写成其它任何字母。
但是一般情况下,Java泛型中的标记符含义是这样的:E - Element (在集合中使用,因为集合中存放的是元素),T - Type(Java 类),K - Key(键),V - Value(值),N - Number(数值类型),? - 表示不确定的java类型。
现在我们来看看“<E extends ClassA>”的含义。在方法装饰符public后直接定义E为泛型,且继承ClassA。也就是说E只能为ClassA的子类了,比如代码里的List<E>,参数里的List<E> lists,都只能是ClassA的子类。我试过传别的类型的参数,结果当然是报错,语句直接报错的那种。
在写这个泛型方法的过程中,我写了一个错误的方法,想用?号定义这个泛型方法。按照我的想法,我定义了一个只能是ClassA的子类的不确定的类,不正好符合我传不同类型当参数进这个方法的逻辑?事实证明,行不通,是我太菜了。
下面代码会报格式错误,如果有小哥哥小姐姐看出来这是什么问题了,望指教。
private List<? extends ClassA> toTreeData(List<? extends ClassA> lists, int pId) {
List<? extends ClassA> tVos = new ArrayList<>();
for(<? extends ClassA> tVo : lists) {
int parentId = tVo.getParentRowNumber();
int id = tVo.getRowNumber();
if(pId == parentId) {
List<? extends ClassA> lossPosts = toTreeData(lists, id);
if(lossPosts.size() > 0) {
tVo.setChildren(lossPosts);
}
tVos.add(tVo);
}
}
return tVos;
}