JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 泛型 and 通配字元
kingzj

喵~



發文: 149
積分: 0
於 2010-08-31 12:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我想請問一個觀念問題
泛型 內的 通配字元 <? exdends List> 意指任何物件只要為List的子類都可以通過 !!!
我根據 良葛葛 大大的教學↓codeing如下程式碼 問題也在程式碼中
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/GenericsTypeWildcards.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.ArrayList;
import java.util.List;
 
public class foo<T> {
  private T foo;
  
  public void setFoo(T foo){
    this.foo = foo;
  }
  
  public T getFoo(){
    return foo;
  }
  
  public void show(foo<? extends List> f){
    System.out.println("OK");
  }
  
  public static void main(String[] args){
    foo f1 = new foo<Boolean>();
    
    foo<? extends List> f2 = null;
    f2 = new foo<ArrayList>();
    //f = new foo<HashMap>();
    
    f2.show(f2);//這個我可以理解 因為我實做的是 ArrayList
    f2.show(f1);//???為何可以通過編譯並順利印出OK 這我就不懂了!!?
  }
}
 


reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kingzj]
kentyeh





發文: 647
積分: 6
於 2010-08-31 14:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
…吃掉  
  public static void main(String[] args){
    foo f1 = new foo<Boolean>();   <--想要問一下為既然已經使用generic了,為何不是宣告為
    
    foo<Boolean> = new foo<Boolean>();  <--我認為改成這樣
    


generic 在 java 只是 compiler sugar,您省略掉 f1 的parametered type宣告,不就是為了讓
f2.show(f1); 通過 compiler編譯?


reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kentyeh]
kingzj

喵~



發文: 149
積分: 0
於 2010-08-31 14:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
kentyeh wrote:
1
2
3
4
5
6
…吃掉  
  public static void main(String[] args){
    foo f1 = new foo<Boolean>();   <--想要問一下為既然已經使用generic了,為何不是宣告為
    
    foo<Boolean> = new foo<Boolean>();  <--我認為改成這樣
    


generic 在 java 只是 compiler sugar,您省略掉 f1 的parametered type宣告,不就是為了讓
f2.show(f1); 通過 compiler編譯?

我懂你的意思
但是即使這樣改 我還是有個疑問
程式如下
1
2
3
public void show(foo<? extends List> f){
  System.out.println("OK");
}

foo<? extends List> 這樣寫的意思是說
任何物件只要是 List 的子類都可以通過
但是 按照 foo<Boolean> f = new foo<Boolean>();
Boolean 並沒有繼承 List !! 卻可以通過 ?
再者
假使我維持原本的寫法
foo f = new foo<Boolean>;
也應該是維持原始的 Object 為介面型態
既然是 Object 那當然不是 List 的子類 !! 為何也能通過?

還請大大指點迷津Sad


kingzj edited on 2010-08-31 14:42
reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kingzj]
kentyeh





發文: 647
積分: 6
於 2010-08-31 14:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
public void show(foo<? extends List> f){
  System.out.println("foo<? extends List> 只是為了給Compiler看的,f 並非真正的generic,"+
     "當傳進來的參數未宣告為gereric,所以compiler就不檢查了");
}


reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kentyeh]
kingzj

喵~



發文: 149
積分: 0
於 2010-08-31 14:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
kentyeh wrote:
1
2
3
4
public void show(foo<? extends List> f){
  System.out.println("foo<? extends List> 只是為了給Compiler看的,f 並非真正的generic,"+
     "當傳進來的參數未宣告為gereric,所以compiler就不檢查了");
}



那如果我要限制 只有 List 的子類才可以進來
直接打
1
public void show(List f){}

這樣嗎 ? 但是這樣原本多型在這裡意義在哪?Disapproved
我好像問題太多了Sad


reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kingzj]
kentyeh





發文: 647
積分: 6
於 2010-08-31 15:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一開始就說java generic本來就是compiler sugar,
它的作用就是加強型別檢查,以及減少 鑄型(type cast),
想想以前您從 collection 取出時物件(真的就是Object)時,其型別總是要自已 cast,
天知道那天會手誤打錯,直到N年後才發現錯誤,現在有了generic,至少少了很多麻煩


reply to postreply to post
作者 Re:泛型 and 通配字元 [Re:kentyeh]
kingzj

喵~



發文: 149
積分: 0
於 2010-08-31 16:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
kentyeh wrote:
一開始就說java generic本來就是compiler sugar,
它的作用就是加強型別檢查,以及減少 鑄型(type cast),
想想以前您從 collection 取出時物件(真的就是Object)時,其型別總是要自已 cast,
天知道那天會手誤打錯,直到N年後才發現錯誤,現在有了generic,至少少了很多麻煩

簡而言之 就是增強 物件的延展性 ?
另外業界泛型常用到嗎 ?
說實話我的工作還真的沒用到過!!
不知到哪個領域常用到!!?(聊天中)


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8