在通過remoting呼叫過載的泛型方法時,遇到了乙個奇怪的問題,現使用乙個例子一步步來說明如下。
一.沒有過載的情況
假設remoting的介面是icomputer:
public
inte***ce
icomputer
在remoting server上的實現非常簡單:
public
class
computer : icomputer }
然後,通過spring.net分別在配置server和client的remoting通道,接著client作如下呼叫:
icomputer remotecomupter
=(icomputer)program.springcontext.getobject(
"remotingcomputer");
intres2
=remotecomupter.add
<
gamerecorddetail
>
(new
gamerecorddetail());
這個呼叫是成功的,沒有任何問題,返回值為0。
二.新增乙個過載
我們為icomputer介面新增乙個過載方法,如下:
public
inte***ce
icomputer
服務端對過載方法的實現仍然是直接返回0。這時在client再次呼叫前面的方法,會丟擲system.nullreferenceexception。異常的堆疊位置是:
&responsemsg, itransportheaders
&responseheaders, stream
&responsestream)
exception rethrown at [
0]:
在 system.runtime.remoting.proxies.realproxy.handlereturnmessage(imessage reqmsg, imessage retmsg)
在 system.runtime.remoting.proxies.realproxy.privateinvoke(messagedata
&msgdata, int32 type)
在 remotinglib.icomputer.add[tentity](tentity c)
三.通過修改方法名消除過載
現將後面新增的方法重新命名為add2,client再次呼叫前面的方法,一切又恢復正常。
四.仍然使用過載,但去掉泛型引數
現在我們恢復過載,但將泛型引數去掉,如下所示:
public
inte***ce
icomputer
服務端對兩個方法的實現仍然是直接返回0。client再次呼叫前面的方法,一切是正常的。
五.測試的結果
根據上述的試驗,我們可以總結出,出現上述奇怪現象的條件有以下幾點:
1.通過remoting呼叫的目標方法必須是泛型的。
2.通過remoting呼叫的目標方法必須有過載。
如果滿足這兩個條件,那麼呼叫目標方法時就會丟擲上面的system.nullreferenceexception。那麼,為什麼會這樣了?答案探索中......
針對這個問題,目前我暫用的解決方案是,通過重新命名方法名以消除過載。
方法的過載
1 方法的過載 方法的名稱和返回值型別都package cn.zcm993.method public class methoddemo02 public static int tell int i,int j public static int tell int i,int j,int k pub...
方法的過載
方法的名字相同但引數的型別或個數不同,我們叫做方法的過載。類允許有相同名字的方法,比如我們這個例子中的raisesalary方法。public void raisesalary double bypercent public void raisesalary int byabsolute 第乙個的引...
方法的過載
方法的過載 方法過載的規則 1.必須在同乙個類中 2.方法名必須一致 3.形參必須不同 1.形參型別不同 2.形參個數不同,兩種任意有乙個不同,都可以 4.修飾符和返回值跟方法過載無關,因為你呼叫方法的時候不會呼叫方法型別,只會用到方法名和引數。作用 可以使相同的方法名實現不同功能。方法過載的概念其...