作者godfat (godfat 真常)
看板java
标题Re: [分享] 原来 Void 可以这样用
时间Fri Mar 13 17:55:01 2009
※ 引述《sbrhsieh (sbr)》之铭言:
: (你的解法还利用了一个 Java 1.5 才引进的语法:covariant returns,这部分
: 还有东西可讨论,细节请参考
: Java Language Spec., 3rd edition - 8.4.5 Method return Type)
Java 我不是很清楚,不过 C++ 很早就有 covariant return type.
http://en.wikipedia.org/wiki/Covariant_return_type
虽然这跟语法没什麽关系,是语意(型别)上的问题。
: 否则,假设你遇到的 interface 是(与现在同样的需求):
: public interface SomeInterface {
: public java.util.List visit(Node node); // return type 不为 Object
: }
: 你该怎麽解呢?
看到这边,我还以为可以解呢!那麽,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 T>
class None: public T{
public:
static None<T>* none(){
static None<T> _;
return &_;
}
private:
None<T>(){}
};
也就是说,None<T> 会是 T 系族群的最底层,其唯一 value 即是 None<T>::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://webptt.com/cn.aspx?n=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