這個(gè)就是java代碼中的泛型啊。。意思是這里L(fēng)ist里面只能放int型的對(duì)象

目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、河南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
首先我們來(lái)定義LockingPtr用到的Mutex類(lèi)的骨架:
class Mutex
{
public:
void Acquire();
void Release();
...
};
為了能使用LockingPtr,你要用你操作系統(tǒng)用到的數(shù)據(jù)結(jié)構(gòu)和基本函數(shù)來(lái)實(shí)現(xiàn)Mutex。
LockingPtr用受控的變量的類(lèi)型來(lái)作為模板。舉例來(lái)說(shuō),如果你想管理一個(gè)Widget,你使用一個(gè)LockingPtrWidget,這樣你可以用一個(gè)類(lèi)型為volatile Widget的變量來(lái)初始化它。
LockingPtr的定義非常簡(jiǎn)單。LockingPtr實(shí)現(xiàn)一個(gè)相對(duì)簡(jiǎn)單的smart pointer。它目的只是把一個(gè)const_cast和一個(gè)臨界區(qū)集中在一起。
Template typename T
Class LockingPtr {
Public:
//構(gòu)造/析構(gòu)函數(shù)
LockingPtr(volatile T obj, Mutex mtx)
: pObj_(const_castT*(obj)),
pMtx_(mtx)
{ mtx.Lock(); }
~LockingPtr()
{ pMtx_-Unlock(); }
//模擬指針行為
T operator*()
{ return *pObj_; }
T* operator-()
{ return pObj_; }
private:
T* pObj_;
Mutex* pMtx_;
LockingPtr(const LockingPtr);
LockingPtr operator=(const LockingPtr);
};
盡管簡(jiǎn)單,LockingPtr對(duì)寫(xiě)出正確的多線(xiàn)程代碼非常有幫助。你應(yīng)該把被幾個(gè)線(xiàn)程共享的對(duì)象定義為volatile而且不能對(duì)它們使用const_cast——應(yīng)該始終使用LockingPtr自動(dòng)對(duì)象。我們通過(guò)一個(gè)例子來(lái)說(shuō)明:
假設(shè)你有兩個(gè)線(xiàn)程共享一個(gè)vectorchar對(duì)象
class SyncBuf {
public:
void Thread1();
void Thread2();
private:
typedef vectorchar BufT;
volatile BufT buffer_;
Mutex mtx_; //控制對(duì)buffer_的訪(fǎng)問(wèn)
}; 軟件開(kāi)發(fā)網(wǎng)
在一個(gè)線(xiàn)程函數(shù)中,你簡(jiǎn)單地使用一個(gè)LockingPtrBufT來(lái)取得對(duì)buffer_成員變量的受控訪(fǎng)問(wèn):
void SyncBuf::Thread1() {
LockingPtrBufT lpBuf(buffer_, mtx_);
BufT::iterator I = lpBuf-begin();
For (; I != lpBuf-end(); I) {
...使用*i...
}
}
這些代碼既非常容易寫(xiě)也非常容易懂——任何時(shí)候你需要用到buffer_,你必須創(chuàng)建一個(gè)LockingPtrBufT指向它。一旦你這樣做,你就能夠使用vecotr的所有接口。
非常好的事情是,如果你犯了錯(cuò),編譯器會(huì)指出來(lái):
void SyncBuf::Thread2() {
//錯(cuò)誤,不能對(duì)一個(gè)volatile對(duì)象調(diào)用begin()
BufT::iterator I = buffer_.begin();
//錯(cuò)誤!不能對(duì)一個(gè)volatile對(duì)象調(diào)用end()
for (; I != lpBuf-end(); I) {
...使用*i...
}
}
你不能調(diào)用buffer_的任何函數(shù),除非你要么使用一個(gè)const_cast要么使用LockingPtr。區(qū)別是LockingPtr提供了一個(gè)有序的途徑來(lái)對(duì)volatile變量使用const_cast。
LockingPtr非常有表現(xiàn)力。如果你只需要調(diào)用一個(gè)函數(shù),你能夠創(chuàng)建一個(gè)無(wú)名臨時(shí)LockingPtr對(duì)象并直接使用它:
Unsigned int SyncBuf::Size() {
Return LockingPtrBufT(buffer_, mtx_)-size();
}
回到基本類(lèi)型
我們已經(jīng)看到了volatile保護(hù)對(duì)象不被不受控制地訪(fǎng)問(wèn)時(shí)是多么出色,也看到了LockingPtr提供了多么簡(jiǎn)單和高效的方法來(lái)寫(xiě)線(xiàn)程安全的代碼。讓我們回到基本類(lèi)型,那些加了volatile后行為與用戶(hù)自定類(lèi)型不同的類(lèi)型
我們來(lái)考慮一個(gè)例子,多個(gè)線(xiàn)程共享一個(gè)類(lèi)型為int的變量。
Class Count
{
public:
...
void Increment() { ctr_; }
void Decrement() { --ctr_; }
private:
int ctr_;
};
如果Increment和Decrement被不同線(xiàn)程調(diào)用,上面的代碼片段是有問(wèn)題的。首先,ctr_必須是volatile,其次,即使象 ctr_那樣看上去是原子操作的函數(shù)實(shí)際上是一個(gè)三步操作。內(nèi)存本身沒(méi)有算術(shù)能力,當(dāng)遞增一個(gè)變量時(shí),處理器:
* 讀取那個(gè)變量到寄存器
* 在寄存器中增加值
* 把結(jié)果寫(xiě)回內(nèi)存
這個(gè)三步操作叫做RMW(Read-ModifyWrite 讀-改-寫(xiě))。在執(zhí)行一個(gè)RMW操作的“改”
操作時(shí),為了讓其他處理器訪(fǎng)問(wèn)內(nèi)存,大多數(shù)處理器會(huì)釋放內(nèi)存總線(xiàn)。
如果那時(shí)另一個(gè)處理器對(duì)同一個(gè)變量執(zhí)行一個(gè)RMW操作,我們就有了一個(gè)竟態(tài)條件;第二個(gè)寫(xiě)操作覆蓋了第一個(gè)的結(jié)果。
你也能夠用LockingPtr避免這種情況:
class Counter
{
public:
...
void Increment() { *LockingPtrint(ctr_, mtx_); }
void Decrement() { --*LockingPtrint(ctr_, mtx_); }
private:
volatile int ctr_;
Mutex mtx_;
};
現(xiàn)在代碼正確了,但代碼質(zhì)量比較SyncBuf的代碼而言差了很多。為什么?因?yàn)樵贑ounter里,如果你錯(cuò)誤地直接訪(fǎng)問(wèn)ctr_(沒(méi)有先對(duì)它加鎖)編譯器不會(huì)警告你。如果ctr_是volatile, ctr_也能編譯通過(guò),但產(chǎn)生的代碼明顯是錯(cuò)誤的。編譯器不再是你的幫手了,只有靠你自己注意才能避免這樣的竟態(tài)條件。
那你應(yīng)該怎么做?簡(jiǎn)單地把你用到的基本數(shù)據(jù)包裝為更高層次的結(jié)構(gòu),對(duì)那些結(jié)構(gòu)用volatile。荒謬的是,盡管本來(lái)volatile的用途是用在內(nèi)建類(lèi)型上,但實(shí)際上直接這樣做不是個(gè)好主意!
volatile成員函數(shù)
到目前為止,我們已經(jīng)有了包含有volatile數(shù)據(jù)成員的類(lèi),現(xiàn)在我們來(lái)考慮設(shè)計(jì)作為更大對(duì)象一部分的類(lèi),這些類(lèi)也被多線(xiàn)程共享。在這里用volatile成員函數(shù)有很大幫助。
當(dāng)設(shè)計(jì)你的類(lèi)時(shí),你只對(duì)那些線(xiàn)程安全的成員函數(shù)加voaltile標(biāo)識(shí)。你必須假定外部代碼會(huì)用任何代碼在任何時(shí)刻調(diào)用volatile函數(shù)。不要忘記:volatile等于可自由用于多線(xiàn)程代碼而不用臨界區(qū),非volatile等于單線(xiàn)程環(huán)境或在一個(gè)臨界區(qū)內(nèi)。
例如,你定義一個(gè)Widget類(lèi),實(shí)現(xiàn)一個(gè)函數(shù)的兩個(gè)變化——一個(gè)線(xiàn)程安全的和一個(gè)快的,無(wú)保護(hù)的。
Class Widget
{
public:
void Operation() volatile;
void Operation();
...
private:
Mutex mtx_;
};
注意用了重載。現(xiàn)在Widget的用戶(hù)可以用同樣的語(yǔ)法來(lái)調(diào)用Operation,無(wú)論你為了獲得線(xiàn)程安全調(diào)用volatile對(duì)象的Operation還是為了獲得速度調(diào)用常規(guī)對(duì)象的Operation。但用戶(hù)必須小心地把被多線(xiàn)程共享的Widget對(duì)象定義為volatile。
當(dāng)實(shí)現(xiàn)一個(gè)volatile成員函數(shù)時(shí),第一個(gè)操作通常是對(duì)this用一個(gè)LockingPtr加鎖。剩下的工作可以交給非volatile的對(duì)應(yīng)函數(shù):
軟件開(kāi)發(fā)網(wǎng)
void Widget::Operation() volatile
{
LockingPtrWidget lpThis(*this, mtx_);
LpThis-Operation(); //調(diào)用非volatile函數(shù)
}
總結(jié)
當(dāng)寫(xiě)多線(xiàn)程程序時(shí),你可以用volatile得到好處。你必須遵守下面的規(guī)則:
* 定義所有的被共享的對(duì)象為volatile。
* 不要對(duì)基本類(lèi)型直接用volatile
* 當(dāng)定義可被共享類(lèi)時(shí),使用volatile成員函數(shù)來(lái)表示線(xiàn)程安全。
如果你這樣做,而且如果你使用那個(gè)簡(jiǎn)單的返型組件LockingPtr,你能夠?qū)懗鼍€(xiàn)程安
全的代碼而不用更多考慮竟態(tài)條件,因?yàn)榫幾g器能為你留心,會(huì)為你主動(dòng)指出你錯(cuò)誤的地方。
我參與的幾個(gè)使用volatile和LockingPtr的計(jì)劃獲得很好的效果。代碼清晰易懂。我記得碰到幾處死鎖,但我情愿遇到死鎖也不要竟態(tài)條件,因?yàn)樗梨i調(diào)試起來(lái)容易得多。事實(shí)上沒(méi)有遇到任何問(wèn)題是關(guān)于竟態(tài)條件的。
首先你寫(xiě)的有問(wèn)題
var object() 這個(gè)還真不知道是什么了
var 是javascript的一個(gè)基礎(chǔ)類(lèi)型的泛型 可以是string int char 等等 也稱(chēng)作弱類(lèi)型
但是他不是一個(gè)函數(shù) 也不能定義成一個(gè)函數(shù)
一般直接定義 var object = 1; var object = " hellow";
還可以是 var object = function double(x){
return 2 * x;
}
或者你因該問(wèn)的是定義函數(shù)的三中方式
第一種:這也是最常規(guī)的一種
function double(x){
return 2 * x;
}
第二種:這種方法使用了Function構(gòu)造函數(shù),把參數(shù)列表和函數(shù)體都作為字符串,很不方便,不建議使用。
var double = new Function('x', 'return 2 * x;');
第三種:
var double = function(x) { return 2* x; }
str='123';
str就是字符串類(lèi)型。
但是它并不是對(duì)象。
既然不是對(duì)象,你instanceof 任何東西都不可能是true
除非你這樣聲明
var str = new String('123')
javascript也會(huì)有自動(dòng)拆裝箱的操作。
str = ‘123’
此時(shí)str是基本數(shù)據(jù)類(lèi)型
但當(dāng)你調(diào)用str.substring方法時(shí)。
javascript解釋器會(huì)將str臨時(shí)包裝成一個(gè)String對(duì)象,然后釋放掉。
所以str不是對(duì)象,但有時(shí)候也是對(duì)象。給你造成了困惑。
var 就是相當(dāng)于聲明符, 作用等同于java代碼中的int、String.....。不過(guò)在js中,var是個(gè)泛型,就是你聲明變量無(wú)論是整形還是字符類(lèi)型都用var。
TypeScript是由微軟開(kāi)發(fā)的一種可快速入門(mén)的開(kāi)源的編程語(yǔ)言,是JavaScript的一個(gè)超集,且向這個(gè)語(yǔ)言添加了可選的靜態(tài)類(lèi)型和基于類(lèi)的面向?qū)ο缶幊獭D軌驇椭鷚eb前端開(kāi)發(fā)人員編出更出色的JavaScript代碼、搞定規(guī)模可觀的JavaScript項(xiàng)目并為ECMAScript 6的來(lái)臨做好準(zhǔn)備。
JavaScript是一款通用腳本語(yǔ)言,植根于開(kāi)發(fā)工具的核心深處,同時(shí)在Node.js等服務(wù)器端實(shí)現(xiàn)方案中也有所體現(xiàn)。除此之外,JavaScript還是微軟開(kāi)發(fā)技術(shù)方案的關(guān)鍵組成部分,若想對(duì)office進(jìn)行擴(kuò)展,不使用JavaScript是不行的。
雖然JavaScript已發(fā)展得非常強(qiáng)悍了,但其離完美還有一大段距離,特別是在構(gòu)建包含大量客戶(hù)端代碼的web應(yīng)用時(shí),JavaScript的不足之處就非常明顯。這個(gè)時(shí)候,配合TypeScript使用,JavaScript的缺陷就可完美解決。只需在TypeScript當(dāng)中編寫(xiě)代碼,而后將其交付至編譯器,即可將所開(kāi)發(fā)代碼轉(zhuǎn)換為能夠運(yùn)行在服務(wù)器端,又可以由客戶(hù)端中的HTML進(jìn)行調(diào)用的JavaScript形式方案。
TypeScript還將大量ECMAScript 6功能加入到了JavaScript當(dāng)中,具體包括類(lèi)與模塊,并嘗試將這兩種本是同根生的語(yǔ)言加以進(jìn)一步融合,從而滿(mǎn)足ECMAScript 6的標(biāo)準(zhǔn)化方法要求。通過(guò)這種方式,大家可以利用TypeScript開(kāi)發(fā)出能夠?yàn)镋CMAScript 6所接納的代碼,同時(shí)充分發(fā)揮TypeScript的靜態(tài)類(lèi)型優(yōu)勢(shì)以提升代碼安全性水平。
TypeScript允許我們面向變量進(jìn)行類(lèi)型聲明,從而確保A始終屬于整數(shù)而C始終屬于字符串。雖然TyperScript的類(lèi)型安全性并不像Fortran那么全面,但其仍然能夠定義數(shù)字與字符串,并利用Boolean類(lèi)型顯著改善代碼調(diào)試機(jī)制。除此之外,TyperScript還提供選項(xiàng)以實(shí)現(xiàn)類(lèi)型推斷,從而降低發(fā)生錯(cuò)誤的可能性如果大家的代碼為兩個(gè)數(shù)字相加,那么TyperScript會(huì)認(rèn)定其結(jié)果始終為數(shù)字。
通過(guò)使用TypeScript,開(kāi)發(fā)者也可以將類(lèi)型應(yīng)用至數(shù)組中,或利用enums為特定變量名稱(chēng)設(shè)置值。如果不確定自己可能使用哪種類(lèi)型,則可以將變量設(shè)定為any,在這種情況下TypeScript不會(huì)推斷其具體類(lèi)型、大家也不會(huì)因此遇到錯(cuò)誤或者警告。TypeScript類(lèi)型可以自行選擇,因此也無(wú)需在編譯或者運(yùn)行之前,首先向現(xiàn)有代碼添加各種類(lèi)型,這將有效簡(jiǎn)化現(xiàn)有代碼的相關(guān)遷移工作。
需要注意的是,現(xiàn)有JavaScript代碼將成為T(mén)ypeScript應(yīng)用程序的一部分加以運(yùn)行。而如果將代碼遷移到ECMAScript 6或者TypeScript語(yǔ)法形式下,大家即可享受到TypeScript的各種功能優(yōu)勢(shì)。而如果我們使用具備TypeScript識(shí)別能力的工具,則可以擁有面向Visual Studio IntelliSense的支持能力——其能夠幫助我們對(duì)函數(shù)調(diào)用中的類(lèi)型進(jìn)行管理。除此之外,也可利用TypeScript聲明文件向各類(lèi)常用庫(kù)及服務(wù)中快速添加類(lèi)型支持,例如jQuery庫(kù)。
擁有這樣一款類(lèi)型化且近似于JavaScript的語(yǔ)言能夠給類(lèi)使用與模塊構(gòu)建帶來(lái)顯著簡(jiǎn)化(與AngularJS當(dāng)中的處理方式非常相近)。類(lèi)型的存在能夠確保某個(gè)警告類(lèi)中的所有實(shí)例都通過(guò)字符串進(jìn)行調(diào)用,這將幫助我們輕松構(gòu)建起更理想的構(gòu)造函數(shù)。大家可以將這種類(lèi)型化構(gòu)造函數(shù)調(diào)用視為一種契約,負(fù)責(zé)定義兩段代碼之間的相互作用——并幫助我們更輕松地在不同應(yīng)用程序之間重復(fù)使用同一函數(shù)。
在函數(shù)調(diào)用當(dāng)中定義類(lèi)型正是創(chuàng)建接口結(jié)構(gòu)的關(guān)鍵所在,能夠使我們的代碼更具面向?qū)ο筇匦浴4蠹铱梢詫⒑瘮?shù)元素明確定義為接口,并選擇在函數(shù)當(dāng)中使用更具描述性的名稱(chēng),同時(shí)又不會(huì)影響到進(jìn)行調(diào)用檢查時(shí)向IntelliSense等函數(shù)所必需的工具發(fā)出通知。
以這種方式定義類(lèi)型與接口,能夠讓多位開(kāi)發(fā)人員輕松對(duì)大型JavaScript項(xiàng)目加以管理。而在函數(shù)與類(lèi)設(shè)計(jì)中秉持“接口至上”的契約化方法,則能夠幫助大家在對(duì)應(yīng)用程序中特定部分進(jìn)行優(yōu)化時(shí)不至于影響到其余部分,或者從其他開(kāi)發(fā)者手中借用某種接口定義并直接運(yùn)用到其它實(shí)現(xiàn)方案當(dāng)中。這種方式允許我們以更為高效的方式使用諸如Git以及GitHub等工具,從而在一套持續(xù)開(kāi)發(fā)模型當(dāng)中輕松管理多個(gè)代碼分支。
如果使用的是Java語(yǔ)言 或者C#語(yǔ)言,那么對(duì)TypeScript(以及ECMAScript 6)的類(lèi)實(shí)現(xiàn)機(jī)制一定不會(huì)感到陌生。大家可以在構(gòu)造函數(shù)之內(nèi)創(chuàng)建類(lèi),從而對(duì)方法中所使用的類(lèi)型進(jìn)行定義,最終利用類(lèi)似的來(lái)處理各種內(nèi)部對(duì)象。大家也可以利用繼承、添加功能與重寫(xiě)方法等方式對(duì)類(lèi)進(jìn)行擴(kuò)展。而更值得注意的是,TypeScript還支持常見(jiàn)于函數(shù)與接口當(dāng)中的泛型——其能夠幫助大家交付可重復(fù)使用的函數(shù)。
一旦掌握了TypeScript處理類(lèi)與函數(shù)的方式, 就可以著手將其組織在模塊當(dāng)中,在這里類(lèi)與函數(shù)能夠被拆分至多個(gè)文件當(dāng)中。這顯然是一種非常便捷的代碼組織方案——舉例來(lái)說(shuō),我們可以利用幾個(gè)文件來(lái)處理購(gòu)物車(chē)當(dāng)中的不同函數(shù)。在此之后,大家可以對(duì)各個(gè)子模塊進(jìn)行分別更新,從而在特定函數(shù)中利用調(diào)整歸零機(jī)制改善其性能水平,同時(shí)又不至于對(duì)其它函數(shù)造成影響。具備聲明文件的JavaScript庫(kù)也可以作為模塊使用,因此大家能夠在TypeScript應(yīng)用程序當(dāng)中充分發(fā)揮由此帶來(lái)的諸多優(yōu)勢(shì)。
在大型web應(yīng)用程序的開(kāi)發(fā)中,對(duì)JavaScript的使用,以TypeScript作為切入點(diǎn),將大大提高我們開(kāi)發(fā)的效率。TypeScript不僅能夠幫助我們?cè)诰邆涑浞终瓶啬芰η易裱芍貜?fù)使用方針的前提下完成編碼工作,同時(shí)也能夠擁有一條通往ECMAScript 6的理想路徑。相信今后web前端開(kāi)發(fā),甚至整個(gè)web端所有網(wǎng)站的開(kāi)發(fā),都將逐步使用到TypeScript,以提高JavaScript的編程效果。
網(wǎng)頁(yè)標(biāo)題:javascript泛型,什么叫泛型編程
URL地址:http://chinadenli.net/article21/dsiecjd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)