先上代码:
class DataModel {
private int total;
private List<Object> rows;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<Object> getRows() {
return rows;
}
public void setRows(List<Object> rows) {
this.rows = rows;
}
}
public class Client {
public static void main(String[] args) {
List list = new ArrayList<Person>();
List<Person> list1 = new ArrayList<Person>();
Person p1 = new Person();
list.add(p1);
Object o = new Person();
list1.add((Person)o);
DataModel data = new DataModel();
data.setRows(list1);
data.setRows(list);
}
}
再上图:
问题:
1. 告警原因:没有对List这个接口进行泛型参数化
2. 错误提示原因:The method setRows(List<Object>) in the type DataModel is not applicable for the arguments (List<Person>)
3. 尝试思路1:多态中向上转型必须现有向下转型,注释代码就是尝试,依然报错
4. 泛型无法识别继承关系?
回答3,4:泛型中不支持继承关系。道理很简单看一段代码:
List<Apple> apple = new ArrayList<apple>();
List<Fruit> fruit = new ArrayList<Fruit>();
当用fruit接收apple的时候会发生什么,apple不仅仅是苹果了,apple可能是西瓜,橘子,香蕉了。再举个例子:你去商场买了一件短袖,难道商场的所有的东西都是可能是你的么?对象范围扩大了!所以报错是一定的。有没有可能任意都可以接收,可能。通配符!
5. 为什么27行的list可以调用setRows?
List list = new ArrayList<Person>();
这个也是可行的,ArrayList是否泛型参数化有什么影响?
回答:缺省泛型,java可以接收,当做object处理,程序出现报警。
6. 27行的list可以接受任意类型的对象,那为什么一定要引入泛型?泛型的作用是什么?
回答:泛型是基础,泛型是通配符的具体表现形式,通配符是为了更抽象化。
7. 泛型来自于C++的模板,是不是要把C++中的模板搞清楚?
没时间,项目间隙好好看看。
8. 问题偶然发现于Json数据的后台封装,Ext中store中的JsonReader配置totalProperty和root,对应一个Javabean就可以从后台获取数据到前台,数据是何时写入到response中的?而对于TreeLoader的dataUrl,如果去读txt文件,jsp文件,js文件是可以写入到树结构中的,但是通过action到后台的话,需要通过servlet的response.getWriter()拿到字节输出流,显示的调用write()函数,否则response的响应值为null,树结构无法生成,为什么?
回答:特别2的问题,action类要提供成员变量,并且提供get和set方法,这样写入response的工作就交给struts了,而不用自己维护。百度struts结构图,一目了然。
9. 太忙,还没有细致的去调查原因,先记录问题,手头事情忙完再来续写这篇博客。