java 中符号_谁能告诉我java中符号的用法,见代码
展開全部
大家都知道Vector以及其他的容器可以不加任何修飾地e68a8462616964757a686964616f31333236373765存儲(chǔ)任何類型的對(duì)象,這給我們帶來了極大的方便,也使得容器很容易被復(fù)用,但是大多數(shù)時(shí)候我們可能需要只能存儲(chǔ)某一類型對(duì)象的Vector,這是因?yàn)槲覀儾幌M捎谧约菏д`或其他原因在Vector中添加(add())了不同類型的對(duì)象而導(dǎo)致在程序中其它地方的get()發(fā)生運(yùn)行時(shí)異常(這是由于不正確的類型轉(zhuǎn)化引發(fā)的),請(qǐng)看下面的例子:
//:TestVector.javaimport java.util.Vector;class Dog{ private int number; public Dog(int number){ this.number = number; } public String toString(){ return "This is number #: " + number; }}public class TestVector { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); v.add(new Integer(4)); //假設(shè)由于我的疏忽,錯(cuò)誤地將Integer類型的對(duì)象添加進(jìn)了v中 for(int j = 0; j < v.size(); j++){ dog = (Dog)v.get(j); //想一想,當(dāng)取到類型為Integer的對(duì)象時(shí)將引起ClassCastException System.out.println(dog); } }}
注意帶有注釋的那兩行,這種錯(cuò)誤在編譯時(shí)并不會(huì)提醒我們,只能在運(yùn)行時(shí)發(fā)生ClassCastException,這是(Dog)v.get(j)引起的,更糟糕的是當(dāng)發(fā)生這種錯(cuò)誤之后我們很難找到錯(cuò)誤的根源在哪里,換句話說就是我們到底在哪里錯(cuò)誤地添加了那個(gè)非Dog類型的Integer對(duì)象,大家運(yùn)行程序就會(huì)明白。尤其是當(dāng)我們?cè)陔x那個(gè)錯(cuò)誤的v.add(new Integer(4))很遠(yuǎn)的地方(可能是很多層)調(diào)用(Dog)v.get(i)時(shí)更是如此。此時(shí)大家可能會(huì)想,如果限制v僅能添加Dog類型的對(duì)象,問題不就解決了嗎?這的確是個(gè)辦法,解決如下:
//: DogVector.javaimport java.util.Vector;public class DogVector { private Vector v = new Vector(); public void add(Dog dog){ v.add(dog); } public Dog get(int index){ return (Dog)v.get(index); } public int size(){ return v.size(); }}//:TestDogVector.javapublic class TestDogVector { public static void main(String[] args) { Dog dog; DogVector dv = new DogVector(); //明確地創(chuàng)建了只能存放Dog對(duì)象的DogVector dv.add(new Dog(1)); dv.add(new Dog(2)); dv.add(new Dog(3)); // dv.add(new Integer(4)); //此時(shí)如果再發(fā)生這種疏忽的話,編譯將不能通過 for(int i = 0; i < dv.size(); i++){ dog = dv.get(i); //此處也不需要向下轉(zhuǎn)型為Dog System.out.println(dog); } }}
問題得到了解決,但此時(shí)大家可能郁悶了,我們?cè)谶@種情況下是不是要寫很多這樣乏味的代碼?每一類需要存儲(chǔ)的對(duì)象都得寫一個(gè)特定的集合類嗎?確實(shí)在JDK1.5以前這的確是個(gè)問題,好在JDK1.5版本中sun引進(jìn)了泛型--java參數(shù)化類型,到此,想必大家已經(jīng)意識(shí)到參數(shù)類型化所要解決的問題之一,就像下面這樣:
Vector v = new Vector(); E在此處代表我們指定v中只能存放E這種類型的對(duì)象,這樣將確保我們不會(huì)錯(cuò)誤地將別的類型的對(duì)象添加進(jìn)去,如果你非要那樣做錯(cuò),編譯器也不會(huì)允許,并且我們?cè)谑褂胓et()方法的時(shí)候也不需要向下轉(zhuǎn)型為對(duì)象本身的類型E,因?yàn)榫幾g器已經(jīng)為我們完成了,它很清楚地知道v中存儲(chǔ)的對(duì)象類型就是E,而且get()返回的對(duì)象類型就是E而不光是Object。試試下面的例子:
//: TestVector2.javaimport java.util.Vector;public class TestVector2 { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); //v.add(new Integer(4)); //此時(shí)如果再發(fā)生這種疏忽的話,編譯將不能通過 for (int j = 0; j < v.size(); j++) { dog = v.get(j); //此處也不需要向下轉(zhuǎn)型為Dog,方法返回類型就是Dog System.out.println(dog); } }}
通過使用參數(shù)類型化,還會(huì)發(fā)生更多的微妙的變化,這里的v.get(j)返回為Dog型只是其中一例,在上例中v的其他一些方法的參數(shù)或返回值也將發(fā)生變化,有些接收Object參數(shù)的方法此時(shí)只能接受Dog或其派生類對(duì)象,如v.Set(int Index, Dog element),注意如果使用Dog及其派生以外的Object類型的對(duì)象做參數(shù)時(shí)將發(fā)生編譯期錯(cuò)誤,這也正是我們?cè)谶@種情況下想要的效果,是不是很爽呢?
好了,羅嗦了這么多,其目的就是想讓大家從問題的根源來理解概念,如果大家還想對(duì)其深入的話,可以找一些專門的資料來看看,想必學(xué)過C++的朋友應(yīng)該對(duì)此很容易理解,因?yàn)閖ava的參數(shù)化類型正是借鑒了C++中模板的概念。(如果你發(fā)現(xiàn)此貼中有不準(zhǔn)確的地方,望及時(shí)指正,以免誤人!謝謝!)
本回答由提問者推薦
已贊過
已踩過<
你對(duì)這個(gè)回答的評(píng)價(jià)是?
評(píng)論
收起
總結(jié)
以上是生活随笔為你收集整理的java 中符号_谁能告诉我java中符号的用法,见代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新华字典java_新华字典查询示例代码
- 下一篇: java在文件的后面添加_java 在f