帮忙看看这个让我很迷惑的问题!谢谢
先看这段代码:
@Test
public void selectlogList() throws
SQLException {
List listq =EntrylogService.searchLocalNewMaplogEntry();
List list=this.initializtionUserForList(listq);
for(int i=0;i <9;i++)
{
System.out.println(((MaplogEntry)list.get(i)).getUser().getUsername());
System.out.println(((MaplogEntry)list.get(i)).getTitle());
}
}
public List initializtionUserForList(List list) throws SQLException
{
List reList=new ArrayList();
for(Iterator it=list.iterator();it.hasNext();)
{
UserInterface ui=(UserInterface)it.next();
User user=UserService.selectById(ui.getUserid());
ui.setUser(user);
reList.add(ui);
}
return reList;
}
1;这段代码运行是顺畅的,没问题;只是有些不 明白。
2;迷惑:reList.add(ui); 这处我加的是一个接口的引用啊
System.out.println(((MaplogEntry)list.get(i)).getTitle()); 但是这里却能得到接口中没定义的东西?
3,说明:接口类 public interface UserInterface {
public long getUserid();
public void setUserid(long userid);
public User getUser();
public void setUser(User user);
}
当然MaplogEntry 是实现了UserInterface 接口的!
望大家指点下,莫嫌分少!
------解决方案--------------------List reList=new ArrayList();
相当于你实例化了一个arraylist实例,所以以后使用的时候会按照ArrayList进行处理
------解决方案--------------------子类实现了接口 就要重新接口的所以方法 {} 里没有内容也是重新了 叫空方法
接口指向实现类 也就是父类指向子类的引用 父类自然可以调用子类所有实现父类的方法
如果 你在子类中自定义一个 父类没有的方法 那么 再有接口调用是调用不到的
这就是多态概念
------解决方案--------------------这就是面向接口进行编程啊,是很好的思想。
List 里添加的就是 MaplogEntry。这个类里肯定有 getTitle() 方法的。
而在 initializtionUserForList 方法中强转成了 UserInterface,只是把自己方法给隐藏掉了,并不扔掉了,当再强转回来的时间,本身的方法就重现了。
------解决方案--------------------最简单的方法,楼主可以这样试一下就知道了
UserInterface ui;
ui = (UserInterface)(new MaplogEntry()); //这里就跟UserInterface ui=(UserInterface)it.next();差不多一个意思。
if (ui instancof MaplogEntry) {
System.out.println( "OK ");
} else {
System.out.println( "NG ");
}