What have you found for these years?

2009-03-13

R: [分享] 原來 Void 可以這樣用

可能要翻翻前面的討論才會比較清楚在講什麼... anyway.
┌─────────────────────────────────────┐
│ 文章代碼(AID): #19kYruKU (java) [ptt.cc] Re: [分享] 原來 Void 可以這樣用 │
│ 文章網址: http://www.ptt.cc/bbs/java/M.1236938104.A.51E.html
│ 這一篇文章值 325 銀 │
└─────────────────────────────────────┘
作者 godfat (godfat 真常) 看板 java
標題 Re: [分享] 原來 Void 可以這樣用
時間 Fri Mar 13 17:55:01 2009
───────────────────────────────────────

Java 我不是很清楚,不過 C++ 很早就有 covariant return type.
http://en.wikipedia.org/wiki/Covariant_return_type

雖然這跟語法沒什麼關係,是語意(型別)上的問題。

*

看到這邊,我還以為可以解呢!那麼,Void 就會是所有 class 的 subclass.
因為 covariant return type 是在說如果 overriding method 的 return type
是 overridden method 的 return type 的 subclass 的話,這個 override
就可以是合法的。因為這件事並不違反 Liskov substitution principle.

如果我們用 parent pointer/reference 來操作的話,不管實際上的 method 的
return type 是什麼,child instance 本來就可以被 parent pointer/reference
指向。也就是說,covariant return type 並不會違反原本預期的操作。

但是我們可以獲得使用 child pointer/reference 時所帶來的好處。
因為其原本就無法指向 parent instance, 所以當然不會有 type 不符合的時候。

以上是稍微說明為什麼可以用 covariant return type.

*

於是 Void 就會是所有 class 的 subclass, 然後就可以在任何 overriding
method 中把 return type 寫成 Void, 因此,就只能夠 return null; 也就是
Void 唯一可能的 value (instance), 而這個 Void instance (null),
同時也是其他任何 pointer/reference 的可能 value, 因為他是 Void 的
instance, class hierarchy 的最底層,相對於 Object 在最頂層。

不過事情果然沒那麼美好:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Void.html

Java 中並不是這樣實作 Void 的...

*

之前在 comp.lang.c++.moderated 還是 comp.std.c++ 看到的討論,
忘記是哪一個了,看到 Andrei Alexandrescu 在談這件事,他說他會用
類似這樣的方式去模擬這樣的效果:

template
class None: public T{
public:
static None* none(){
static None _;
return &_;
}
private:
None(){}
};

也就是說,None 會是 T 系族群的最底層,其唯一 value 即是 None::none()
詳細測試程式在此:http://gist.github.com/78509 Java 板這邊就不多說了。

回到 Java, 沒有 template 該如何解呢?大概就是捨棄 Void,
然後手動寫 None_Object (等同於 Void), None_java_util_List,
一個族系手動寫一個吧。然後 null 可能就變成 None_Object.null,
None_java_util_List.null, 一個 static method 回傳那唯一的 value,
看到他就猶如看到 null 如此這般...

一點(好久沒碰過 java 的人的)淺見。

--
#!/usr/bin/env ruby [露比] /Programming (Kn|N)ight/ 看板《Ruby》
# if a dog nailed extra legs that http://www.ptt.cc/bbs/Ruby/index.html
# walks like an octopus, and Welcome ~Ruby@ptt~
# talks like an octopus, then ◢█◣ http://www.ruby-lang.org/
# we are happy to treat it as █ http://www.ruby-doc.org/
# if it were an octopus. ◥ ◤ http://www.rubyforge.org/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0