日期:2014-05-20  浏览次数:20703 次

帮忙看看这个让我很迷惑的问题!谢谢
先看这段代码:
@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 ");
}