泛型的思考

先上代码:
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. 太忙,还没有细致的去调查原因,先记录问题,手头事情忙完再来续写这篇博客。

你可能感兴趣的:(泛型)