ITPUB??ì3
ITPUB论坛 » Java入门与认证版 » 如何进行泛型的递归定义

新一届的微软MVP评选已经开始,欢迎各位推荐!

标题: 如何进行泛型的递归定义
  本主题由 greenflute 于 2008-6-1 02:07 提升 
离线 juan002
中级会员



精华贴数 0
个人空间 0
技术积分 4210 (334)
社区积分 0 (1441336)
注册日期 2007-6-21
论坛徽章:19
开发板块每日发贴之星生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠
生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠

发表于 2008-5-27 07:53 
如何进行泛型的递归定义

大家好,最近写一个涉及泛型的测试,真是死的心都有:
遇到如下问题,请高手指正:
1  
public interface ILogicalProcess <LP,S extends AbstractState> extends IModel {
声明了这样一个接口,
但是在使用时,我希望把LP替换为一个ILogicalProcess类型,但似乎进入了一个递归的定义。。。。,这样做是否合法,如果不合法,那么如何定义呢
这样写
         ILogicalProcess <ILogicalProcess <ILogicalProcess <LP。。。。,S extends AbstractState>
晕了,
2    父类型参数不能用子类替换的问题:
我声明了如下的类,
public class simpleLogicalProcess <LP,S extends AbstractState> extends
LogicalProcess <LP,S>{

其中,一个函数changestate可以返回AbstractState类型的数据,
而另一个函数setInnerstate可以接受S类型的数据,但我在进行如下调用时
setInnerstate(((SimpleEvent)event).changestate(this.getInnerstate()));
居然报错:
The method setInnerstate(S) in the type simpleLogicalProcess <LP,S> is
not applicable for the   arguments (AbstractState)

不会吧。。。

Java code
public class simpleLogicalProcess<LP,S extends AbstractState> extends
LogicalProcess<LP,S>{
//WB do i really need the flexibility?
private S innerstate;
public simpleLogicalProcess() {
   super();


   // TODO Auto-generated constructor stub
}

public simpleLogicalProcess(String name) {
   super(name);
   // TODO Auto-generated constructor stub
}

@Override
public ArrayList<LP> influenced() {
   // TODO Auto-generated method stub
   return super.influenced();
}

@Override
public ArrayList<IEvent<LP, ?, ?>> out() {
   // TODO Auto-generated method stub
   return super.out();

}

@Override
protected void sendEvent(IEvent<LP, ?, ?> event) {
   // TODO Auto-generated method stub
   super.sendEvent(event);
}

@Override
public void run(IEvent<?, ?, ?> event) {
   // TODO Auto-generated method stub
   if (event instanceof SimpleEvent)
   {
     setInnerstate(((SimpleEvent)event).changestate(this.getInnerstate()));
   }

}

public S getInnerstate() {
   return innerstate;
}

public void setInnerstate(S innerstate) {
   this.innerstate = innerstate;
}

}


  interface SimpleEvent extends IEvent{

    public AbstractState changestate(AbstractState  raw);

  }


只看该作者    顶部
离线 dotnetworker
一般会员



精华贴数 0
个人空间 0
技术积分 4690 (290)
社区积分 0 (1442324)
注册日期 2007-6-21
论坛徽章:33
开发板块每日发贴之星开发板块每日发贴之星开发板块每日发贴之星生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠
生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠

发表于 2008-5-27 07:54 
你的标题已经吓到我了……


只看该作者    顶部
离线 greenflute


精华贴数 0
个人空间 0
技术积分 7216 (178)
社区积分 162 (2640)
注册日期 2001-10-26
论坛徽章:15
现任管理团队成员ITPUB元老管理团队2007贡献徽章会员2007贡献徽章2008北京奥运纪念徽章:沙滩排球2008年新春纪念徽章
      

发表于 2008-6-1 01:50 
仅供参考:




greenflute 上传了这个附件:
2008-6-1 01:50
A.png (15.66 KB)
 

只看该作者    顶部
离线 greenflute


精华贴数 0
个人空间 0
技术积分 7216 (178)
社区积分 162 (2640)
注册日期 2001-10-26
论坛徽章:15
现任管理团队成员ITPUB元老管理团队2007贡献徽章会员2007贡献徽章2008北京奥运纪念徽章:沙滩排球2008年新春纪念徽章
      

发表于 2008-6-1 01:51 
事实上,如果把泛型字母换一下,更有助于澄清理解上的偏差




greenflute 上传了这个附件:
2008-6-1 01:51
B.png (15.46 KB)
 

只看该作者    顶部
离线 sinkeler
SCJP | SCWCD
Specialist


来自 北京
精华贴数 3
个人空间 0
技术积分 1015 (1796)
社区积分 1 (37458)
注册日期 2005-3-2
论坛徽章:1
生肖徽章2007版:牛     
      

发表于 2008-6-2 09:04 
挺绕的。


__________________
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问