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

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
kentyeh





發文: 641
積分: 6
於 2004-10-16 19:22 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
我也提供一個Enum範例n
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
31
32
33
34
public enum Week{
  Sun(0){
    public boolean isHoliday(){
      return true;
  }
  }, Mon(1), Tue (2), Wed (3), Thu (4), Fri(5),Sat( 6) {
    public boolean isHoliday(){
      return true;
    }
  };
  Week(int value){this.value=value;}
  private final int value;
  public int value(){return value;}
    public boolean isHoliday(){return false;}
  @Override public String toString(){
    switch(value){
      case 0: return "週日";
      case 1: return "週一";
      case 2: return "週二";
      case 3: return "週三";
      case 4: return "週四";
      case 5: return "週五";
      case 6: return "週六";
    }
    return null;
  }
}
 
public class Main {
  public static void main(String arg[]){
    System.out.println(Week.Sun+" is "+(Week.Sun.isHoliday()?"a":"not a")+" Holiday");
  for(Week aday : Week.values())
    System.out.println(aday);
}
產出結果
1
2
3
4
5
6
7
8
週日 is a Holiday
週日
週一
週二
週三
週四
週五
週六


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:moliwang]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-10-19 14:30 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
moliwang wrote:
compiler sugar,把所有參數化為一個array.

最近都在確認一些新功能的實際真相,
目前試過確定的, for each, enum, var agrs都是.
不過enum有加了一些attribute在class file裡面.


varargs 有動到 bytecode,因為有用到不定參數的 method 其 signature 是使用 array type,與原本 formal parameter 就是 array type 的 method 的 signature 相同,但後者不能享受編譯器自動把多個參數自動 pack 成 array 的便利寫法,這一定得靠在 method 裡加上額外的 attribute(這部分是不需要變更 bytecode format) 來區分二者。

另外,我有個相容性的疑問,foreach 是針對 1.5 引進的 java.lang.Iterable 設計的,這使得使用 foreach 的程式 bytecode 沒有辦法在 pre 1.5 以前的 JRE 跑,即使其底層作法只是利用原來就有的 iterator;撇開 Iterable 的因素,要使用 foreach 就得指定 source 1.5,那麼 bytecode 一定得 target 在 1.5 以後,這樣一來版號 49.0 會使得 pre 1.5 VM reject loading class bytecode。如果考慮到目前大量的 1.4 JRE 存在,我寧願多打幾個字,乖乖用 iterator,更何況像 Eclipse JDT 對 statement template 的支援下打 for/while 來使用 collection or array 都很容易。


Duncan edited on 2004-10-19 15:13
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:koji]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-10-20 01:16 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
koji wrote:
我是看到這種極端一點的
1
2
static<T> boolean addAll(Collection<? super T> c, T... a) 
static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 

會瞞想翻桌的!!
還沒看習慣,還瞞暈頭的哈哈


java.lang.Enum<E extends Enum<E>>
看起來夠奇怪吧?

第一眼看到讓我聯想起GNU is a recursive acronym for “GNU's Not UNIX”


Duncan edited on 2004-10-20 01:18
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
T55555

Java, Ruby, Haskell

版主

發文: 1026
積分: 24
於 2004-10-23 00:21 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
For the architect leader of J2SE releases 5.0, the most important about J2SE 5.0 is annotations (JSR 175).
see http://java.sun.com/developer/technicalArticles/Interviews/hamilton_qa.html

好像在這個 thread, 到現在沒人提到 annotation...
我就來簡介 annotation 一下.
annotation =~ well-defined metadata mechanism.
基本上 Tiger 有 3 個已定義的 annotations:
@Override, @Deprecated, @SuppressWarnings.
你當然可以定義新的 (Ex. Web Services metadata JSR 181).
在這裡我只簡單的介紹 @Override

譬如下面的 code:
1
2
3
4
5
6
JPanel p = new JPanel();
p.addMouseListener( new MouseAdapter() {
  public void mouseClick(MouseEvent e) {
  // do something when mouse clicked
  }
});


Compile 過了, 不過 mouse click 卻沒有做我們想要的事,
原因很簡單, mouseClicked 寫錯成 mouseClick ...
用 annotation 就可以在 compile time 發現這錯誤 ...
1
2
3
4
5
6
7
JPanel p = new JPanel();
p.addMouseListener( new MouseAdapter() {
  @Override
  public void mouseClick(MouseEvent e) {
  // do something when mouse clicked
  }
});

==> get compile error: method does not override a method from its superclass

當然 annotation 的功用並非如此簡單, 如果你有興趣,
可以看看 Mapping Objects to XML Files using Java 5 Annotations
http://www.javaspecialists.co.za/archive/Issue097.html


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:moliwang]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-11-01 17:34 user profilesend a private message to usersend email to Duncanreply 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 generics 的一個設計目標是:如果編譯時沒有 unchecked warning,那麼 code 保證會是 type safe。

那麼有沒有人可以寫一個 concrete class 類似如下:
1
2
3
4
5
6
7
public class Factory<T>
{
    public T make() // no formal parameter
    {
     // ...
    }
}


完全沒有 unchecked warning?我的意思是實做當中所有 involved 的東西都沒有 unchecked warning(core classes 本身是有 unchecked warning 的)。

基本上在我看來這是不可能的,那麼是不是代表 generics 沒有辦法為我們帶來更多(更堅固)的 type safe 的保證?因為你寫不出一個真正 type safe 的 code,即使你用了 generics。


Duncan edited on 2004-11-01 17:43
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
GundamAstray

藍色異端



發文: 10
積分: 0
於 2004-11-06 18:18 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
annotation 看起來有點像是.Net平台的[Attribute](旗標有書翻成"特徵項")
我猜是類似metadata/metainfo之類的延伸吧


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:Duncan]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-07 18:16 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
Duncan wrote:
Java generics 的一個設計目標是:如果編譯時沒有 unchecked warning,那麼 code 保證會是 type safe。

那麼有沒有人可以寫一個 concrete class 類似如下:
1
2
3
4
5
6
7
public class Factory<T>
{
    public T make() // no formal parameter
    {
     // ...
    }
}


完全沒有 unchecked warning?我的意思是實做當中所有 involved 的東西都沒有 unchecked warning(core classes 本身是有 unchecked warning 的)。

基本上在我看來這是不可能的,那麼是不是代表 generics 沒有辦法為我們帶來更多(更堅固)的 type safe 的保證?因為你寫不出一個真正 type safe 的 code,即使你用了 generics。


看不明白你在說甚麼.........
但只要沒有 unchecked warning, type safe 是可以做到的, 因為 <T> 不是一個任意的物件


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-07 20:33 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
看不明白你在說甚麼.........
但只要沒有 unchecked warning, type safe 是可以做到的, 因為 <T> 不是一個任意的物件


我的意思是:不可能沒有 unchecked warning。你寫的部分可以沒有 unchecked warning,但是你的程式用到的 core classes 本身一定有 unchecked warning,我認為就目前的 generics 設計來說,根本寫不出例子中的碼而完全沒有 unchecked warning。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-08 22:59 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
不~~!!!
是可以做到沒有 unchecked warning 的
但必需熟練 generics type

而且你指的 "core classes" 是指甚麼????

你能試列出不能消除 unchecked warning 的例子嗎???


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
ming500





發文: 22
積分: 0
於 2004-12-08 23:46 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
学习学习,我没有用过j2se 5

reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
markc





發文: 26
積分: 1
於 2004-12-21 00:42 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
Overriding Return Types:Using Java Inheritance to overriding the return type of superclass's method

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Test1 {
  protected int x;
  
  public Test1() {
    x = 0;
  }
  
  public Test1(int x) {
    this.x = x;
  }
}
 
class Test2 extends Test1 {
  protected int y;
  
  public Test2(int x) {
    this(x, 0);
  }
  
  public Test2(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
 
class Test3 {
  Test1 t;
  
  public Test3() {
    t = new Test1();
  }
  
  public Test3(int x) {
    t = new Test1(x);
  }
  
  public Test1 getTest() {
    return t;
  }
}
 
class Test4 extends Test3 {
  Test2 t;
  
  public Test4(int x, int y) {
    t = new Test2(x, y);
  }
  
  public Test2 getTest() {
    return t;
  }
}


重點在getTest


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-21 03:12 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
不~~!!!
是可以做到沒有 unchecked warning 的
但必需熟練 generics type

而且你指的 "core classes" 是指甚麼????

你能試列出不能消除 unchecked warning 的例子嗎???


generic 引進後最大量使用此一 facility 的當屬 java.util 裡的泛 Collection 類別。
就我上面提到的 Factory class 來說,你能不能寫出 Factory - make(顧名思義,建構 Factory 的 actual type argument 類別的物件並傳回)這樣的 method 完全沒有 unchecked warning 被隱瞞?這有可能,但幾乎每一種寫得出來這樣的 Factory concrete class 的用途都很少,比方說:
1
2
3
4
5
6
7
8
9
10
11
12
public class Factory<T> {
  public T make()
  {
    return product;
  }
 
  private T product;
  public void setProduct(T product)
  {
    this.product = product;
  }
}


我個人覺得這樣的 class 其實用途並不大,他只不過是把一個 reference 來回傳遞而已。編譯時期型態檢驗主要是發生 setProduct 這個 method call 時,這和你寫一個 non-generics Factory class(每一個 T 出現的地方都換成一個 specific type)是差不多的。

如果把 Factory class 改成類似 Collection(也就是某種東西 T 的集合體),make method 傳回集合中的某一個 element;或是 make 的 return value 並不經由 Factory class 中其他 method 的 argument 傳遞過來(又不能傳回 null),也就是說被傳回 reference value 的 object 是在 make method 裡建構出來的(可以是其他 class 的某個 method 的 non-null 傳回值,但那個 class 不能像是上一段的 Factory<T> 那樣的 trivial)。這樣還有辦法做到完全沒有 unchecked warning 嗎?


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
markc





發文: 26
積分: 1
於 2004-12-21 10:41 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
眼裡都是角括號在飛(飛蚊症)
視力快速退化中
快要抓狂了


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-28 17:30 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
只是一部小份地方使用generics type 當然沒有用

但當大部份都使用 generics type,
情況就差太遠了

......修正........

你的 Factory 例子
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
public class Factory<T>{
  public T make() {
    return product;
  }
  private T product;
  public void setProduct(T product){
    this.product = product;
  }
}
 
// 就可以安心使用
Factory<Map> mapFactory=new Factory<Map>();
mapFactory.setProduct(new HashMap());
Factory<List> listFactory=new Factory<List>();
listFactory.setProduct(new ArrayList());
 
mapFactory.make().entrySet().iterator();
List list=listFactory.make();
 
//而不必怕會出現
listFactory.setProduct(new HashMap());
Map map=listFactory.make();
 
//不必自行寫多個 Factory class
//也沒有必要加上 (Map) 作 type casting
((Map)mapFactory.make()).entrySet().iterator();
List list=(List)listFactory.make();


續.......


hkdennis2k edited on 2004-12-28 18:26
reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
moliwang

用嘴巴打嘴炮比用鍵盤打嘴炮要來的務實

版主

發文: 1215
積分: 6
於 2004-12-28 17:41 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
看到這一段的時候,一開始還不知道怎麼半才好,
因為我只學過
public class Factory <T>
這樣的語法.
我還懷疑我以前用了有問題的compiler和開發工具.

public class <T> Factory
您確定您用過上面的語法在JDK 5.0的compiler成功編譯過嗎?

不知道怎麼辦的人留...

hkdennis2k wrote:
只是一部小份地方使用generics type 當然沒有用

但當大部份都使用 generics type,
情況就差太遠了

我看你還沒有深入了解 generics type
首先你的句式錯了, public class <T> Factory 才對



reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-28 17:51 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
我看你還沒有深入了解 generics type
首先你的句式錯了, public class <T> Factory 才對


我不知道你何以這樣說?!情況比較像是你根本沒寫過 generic class 就上來為大家說教了,這樣會不會太熱心了一點?


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-28 18:25 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
那好像是我記錯了......
記憶把 local scope 的 generic 和 class scope 的 generic 打亂了

在 sun.com "果然" 找不到相關, 正式的文件
Java Lang Spec 還只是找到 1.4 的....

我寫過一次, 在一個月前左右(可惜最近都沒有時間..)

說回來.....
有 unchecked warning 的實例嗎??


hkdennis2k edited on 2004-12-28 18:37
reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-28 19:51 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
說回來.....
有 unchecked warning 的實例嗎??


舉個例子,翻翻 1.5 的 source code: java.util.ArrayList

他有個 non-static field: elementData 宣告為 E[],ArrayList 許多的 method 裡都可以看到 explicitly cast Object[] -> E[] 的 statements,這些 statements 都會有 unchecked warning(unchecked cast),實際上 elementData 就是 Object[],而這些 unchecked cast 的 statement 在編譯後都沒有產生 cast 的指令(checkcast instruction),因為編譯期無法知道 actual type argument 是什麼。

我前幾次貼文的重點就是,當你使用了 java.util.ArrayList,儘管你所寫的 client code 部分都沒有 unchecked warning,但在 core classes library 是在忽略 unchecked warning 的情況下,client code 還依然算是沒有 unchecked warning 嗎?這樣還有符合 sun 所稱:"只要寫出來的碼沒有 unchecked warning,就保證程式是 type safe" 嗎?

今天任何 third-party library 當初編譯時都有可能 ignore unchecked warning(特別是那些非 open source 的 library 你沒有 source code 檢驗),那麼使用 third-party library 的程式要怎麼確保是 type safe?只依靠編譯 client code 有沒有 unchecked warning 產生這條件足夠嗎?


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:Duncan]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-28 21:48 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
Duncan wrote:
舉個例子,翻翻 1.5 的 source code: java.util.ArrayList

他有個 non-static field: elementData 宣告為 E[],ArrayList 許多的 method 裡都可以看到 explicitly cast Object[] -> E[] 的 statements,這些 statements 都會有 unchecked warning(unchecked cast),實際上 elementData 就是 Object[],而這些 unchecked cast 的 statement 在編譯後都沒有產生 cast 的指令(checkcast instruction),因為編譯期無法知道 actual type argument 是什麼。

我前幾次貼文的重點就是,當你使用了 java.util.ArrayList,儘管你所寫的 client code 部分都沒有 unchecked warning,但在 core classes library 是在忽略 unchecked warning 的情況下,client code 還依然算是沒有 unchecked warning 嗎?這樣還有符合 sun 所稱:"只要寫出來的碼沒有 unchecked warning,就保證程式是 type safe" 嗎?

今天任何 third-party library 當初編譯時都有可能 ignore unchecked warning(特別是那些非 open source 的 library 你沒有 source code 檢驗),那麼使用 third-party library 的程式要怎麼確保是 type safe?只依靠編譯 client code 有沒有 unchecked warning 產生這條件足夠嗎?


???
我以前看過 1.5 ArrayList 的 source, 差不多都沒有使用 Object 或 Object[]
全都是以 E 和 E[] 代替了,

也就是說, 在 elementData 不是 object, 而是 E
而 E 就是在就是在建立 ArrayList 的 instance 時決定的

除了 toArray() 之外----可用 toArray(new E[0]) 替代
沒有一句是會發生 unchecked warning, 也沒有必要在內部 checkcast
而且, 你根本沒有法子把 E 以外的 object 加進去

>因為編譯期無法知道 actual type argument 是什麼
編譯期不必 actual type 是什麼,
它只要知道各句子的 type 都沒有使用到 E 沒有的 member 已足夠

<E extends Object>, 而每個 varible 的 actual type, 也都在 decliation 中說明了
這已經足夠

例如
1
2
3
List<String> list=new ArrayList<String>; 
list.add("abc");
list.get(0).charAt(0);

是安全的
java.lang.String 是合付 "extends Object" 這個條件
List<String> 可以容下 ArrayList<String>
list.add(E obj); -> list.add(String obj);
get(0) return 的是 E, 而 List<String> list 指定了 E 是 String, 所以有效


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-28 23:03 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
???
我以前看過 1.5 ArrayList 的 source, 差不多都沒有使用 Object 或 Object[]
全都是以 E 和 E[] 代替了,

也就是說, 在 elementData 不是 object, 而是 E
而 E 就是在就是在建立 ArrayList 的 instance 時決定的

除了 toArray() 之外----可用 toArray(new E[0]) 替代
沒有一句是會發生 unchecked warning, 也沒有必要在內部 checkcast
而且, 你根本沒有法子把 E 以外的 object 加進去

>因為編譯期無法知道 actual type argument 是什麼
編譯期不必 actual type 是什麼,
它只要知道各句子的 type 都沒有使用到 E 沒有的 member 已足夠

<E extends Object>, 而每個 varible 的 actual type, 也都在 decliation 中說明了
這已經足夠

例如
1
2
3
List<String> list=new ArrayList<String>; 
list.add("abc");
list.get(0).charAt(0);

是安全的
java.lang.String 是合付 "extends Object" 這個條件
List<String> 可以容下 ArrayList<String>
list.add(E obj); -> list.add(String obj);
get(0) return 的是 E, 而 List<String> list 指定了 E 是 String, 所以有效


我覺得你對事情抱著太多想當然爾的心態,很多事你都自認為是怎樣,都讓你有把握到來否定他人的觀點,到頭來才發現你講錯了....

基本上我不認為你了解什麼是 unchecked warning,更不了解 bytecode,你以為編譯器就直接在 class bytecode 裡標明以 type parameter(諸如 T or E) 為其 runtime type 嗎?不是,單純以 T or E 等 type parameter 標記的變數(field) 其 runtime type 是 Object(這部分細節不談)。

上一篇提到把 Object[] cast 成 T[] or E[] 是 unchecked cast,是因為在編譯時期 T or E 並不明確,編譯器沒有辦法確實地產生 checkcast instruction 的參數(指明一種 type),不要再提什麼建構時指定 actual type argument,一個 generics class 在編譯時(可以)根本就沒有 instantiate 此 class 的碼存在,還是一樣要編譯出 class bytecode 來。

舉個例子:
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
1:import java.util.ArrayList;
2:import java.util.List;
3:
4:public class ReallySafe {
5:  public static void main(String[] args)
6:  {
7:    Tricker<Integer> gremlin = new Tricker<Integer>(new Integer(87));
8:    List<String> list = new ArrayList<String>();
9:    list.add(gremlin.getData());
10:    System.out.println(list.get(0));
11:  }
12:}
13:
14:
15:class Tricker<T> {
16:  private T data;
17:  public Tricker(Object data)
18:  {
19:    this.data = (T)data;
20:  }
21:
22:  public String getData()
23:  {
24:    return (String)data;
25:  }
26:}


line 19 有一個 unchecked warning(warning name: unchecked cast),實際上去運行這個程式 ClassCastException 會在 line 24 丟出。

如果把 line 7 那行改成以 "Hello, generics!" 當作參數:
1
7:    Tricker<Integer> gremlin = new Tricker<Integer>("Hello, generics!");


一樣是在 line 19 有 unchecked warning,但這個程式跑起來好好的。這兩個 case 顯示出 line 19 是虛晃一招(名 "unchecked" cast)。


Duncan edited on 2004-12-28 23:44
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:Duncan]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-28 23:59 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
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1:import java.util.ArrayList;
2:import java.util.List;
3:
4:public class ReallySafe {
5:  public static void main(String[] args)
6:  {
7:    Tricker<String> gremlin = new Tricker<String>("asd");
8:    List<String> list = new ArrayList<String>();
9:    list.add(gremlin.getData());
10:    System.out.println(list.get(0));
11:  }
12:}
13:
14:
15:class Tricker<T extends String> {
16:  private T data;
17:  public Tricker(T data)
18:  {
19:    this.data = data;
20:  }
21:
22:  public String getData()
23:  {
24:    return data;
25:  }
26:}


我都說了, 是要了解過它的人才會寫......

正所謂 Garage In, Garage Out
<T>, 不是亂寫下去的, 也不是可以胡亂找個 Class 放在 constructor 後就可以的

你的例子本來就不能執行, 所以, 它不能被正常的改寫......
就是 Generic type 在 compile time 就能找出 error 的能力, 而不是 runtime 才被發現


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:Duncan]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-29 00:08 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
Duncan wrote:
基本上我不認為你了解什麼是 unchecked warning,更不了解 bytecode,你以為編譯器就直接在 class bytecode 裡標明以 type parameter(諸如 T or E) 為其 runtime type 嗎?不是,單純以 T or E 等 type parameter 標記的變數(field) 其 runtime type 是 Object(這部分細節不談)。


不會被 compile 為 java.lang.Object ~!!

它不只是給 compiler 看的, 而是會記錄在 bytecode 之上
1.5 的 java.lang.reflect 內不少也是為了 Generic 而生的 class
例如 Type, GenericDeclaration

而且根本 type parameter 的基本可以不是 Object,
而是其他 class 或 interface


reply to postreply to post
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-29 00:35 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
不會被 compile 為 java.lang.Object ~!!

它不只是給 compiler 看的, 而是會記錄在 bytecode 之上
1.5 的 java.lang.reflect 內不少也是為了 Generic 而生的 class
例如 Type, GenericDeclaration

而且根本 type parameter 的基本可以不是 Object,
而是其他 class 或 interface


class file format 是有新的 attribute 沒錯,但 instruction 還是沿用。你還是研究一下 bytecode instructions 再來討論吧。


Duncan edited on 2004-12-29 00:52
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:hkdennis2k]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-12-29 00:39 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
hkdennis2k wrote:
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
1:import java.util.ArrayList;
2:import java.util.List;
3:
4:public class ReallySafe {
5:  public static void main(String[] args)
6:  {
7:    Tricker<String> gremlin = new Tricker<String>("asd");
8:    List<String> list = new ArrayList<String>();
9:    list.add(gremlin.getData());
10:    System.out.println(list.get(0));
11:  }
12:}
13:
14:
15:class Tricker<T extends String> {
16:  private T data;
17:  public Tricker(T data)
18:  {
19:    this.data = data;
20:  }
21:
22:  public String getData()
23:  {
24:    return data;
25:  }
26:}


我都說了, 是要了解過它的人才會寫......

正所謂 Garage In, Garage Out
<T>, 不是亂寫下去的, 也不是可以胡亂找個 Class 放在 constructor 後就可以的

你的例子本來就不能執行, 所以, 它不能被正常的改寫......
就是 Generic type 在 compile time 就能找出 error 的能力, 而不是 runtime 才被發現


你到底在說什麼?

總歸一句,你還是沒了解我的問題核心在哪一點。你建構了 ArrayList<String> object,你就能安心地說他是 type safe 嗎?如上一篇的例子,ArrayList 裡面一堆 unchecked cast 都是空的,都不能保證在 runtime 檢查出來型態不合,你只能期望實做 core classes 的人能真的正確實做其行為,是不是這樣?這才是我關心的。

如果連在 runtime 都不能保證了,就不要說什麼編譯期就發現。


Duncan edited on 2004-12-29 00:42
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:J2SE5.0 新增的好用小功能 [Re:popcorny]
hkdennis2k





發文: 1926
積分: 6
於 2004-12-29 00:56 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
另開一篇新話題吧......

reply to postreply to post
go to first page go to previous page  1   2   3  go to next page go to last page
» JWorld@TW »  Java SE 討論區

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