※ 引述《macbuntu (邀怪)》之銘言:
: ※ 引述《godfat (godfat 真常)》之銘言:
: : 於是 Void 就會是所有 class 的 subclass, 然後就可以在任何 overriding
: : method 中把 return type 寫成 Void, 因此,就只能夠 return null; 也就是
: : Void 唯一可能的 value (instance), 而這個 Void instance (null),
: : 同時也是其他任何 pointer/reference 的可能 value, 因為他是 Void 的
: : instance, class hierarchy 的最底層,相對於 Object 在最頂層。
: 如果 Java 真的放了一個這樣的 Void, 會破壞了現在嚴謹的繼承架構,
: 而且除非是 syntax based template, 否則一個真的 wildcard class 已經不能
: 算是符合 covariant return type 的限制了, 從語意到 compiler 都只能當
: 例外狀況處理, 這樣就不划算了.
當然 Java 不可能會放這種東西,所以當我以為有解的時候,
是感到非常訝異的 XD 同時我也覺得與其說嚴謹,不如說死板 :s
當然這種說法本身就帶有意識形態了。另外如果真的要在 Java 裡面做的話,
我覺得最簡單的例外就是只允許 Void 有多重繼承,然後去繼承所有東西即可。
也當然這做法非常粗糙,能帶來的好處又非常有限,不如不做。
: 話說回來, 印象中 Scala 就有這種 wildcard type?
: 它還真的有一個 Null class 跟 Nothing class 是 class hierarchy 的最底層,
: 不過我不會寫 Scala, 我不知道這只是 internal class 還是 programmer 可以直接
: 使用的型別... 如果 programmer 可以使用, 真好奇 covariant arguments 遇到
: 這種型別要怎麼處理?
Scala 我不熟哩,不過經你一提我大概看了一下 Null 和 Nothing.
http://www.scala-lang.org/docu/files/api/scala/Null.html
http://www.scala-lang.org/docu/files/api/scala/Nothing.html
而 Null 和 Nothing 當然是 programmer 可以用的東西。
至於怎麼用呢?上面那兩個連結其實就已經說明了。
Null 應該很好理解吧?就像我上一篇提到的,他只有唯一的一個 instance,
就是 null, 而他也同時是所有 reference type 的 subtype,
所以在原本 sbrhsieh 的例子裡:
public interface SomeInterface {
public java.util.List visit(Node node); // return type 不為 Object
}
實作就是:
class SomeVisitor implements SomeInterface{
public Null visit(Node node){
return null; // 這就是唯一選擇了
}
}
這邊跟你原本用 Void 是一樣的。
java.lang.Object
extended by java.lang.Void
你只要把 Null 想像成 Void, 而 java.util.List 想像成 Object 就行了。
只是 Void 只接受 Object, 因為那是他唯一的 parent.
而 Null 接受任何 reference type (也就是不接受 value type),
也不接受 Nothing, 因為 Nothing 比 Null 更底層,其他一律接受。
因為他的 parent 就是以上這些東西。
也像是我原本 C++ 裡寫的 None<T> 只是更 general, 因為 None<T>
和 None<S> 又是不同的,但是 Scala 的 Null 只有一個!
*
Nothing 就完全是另一回事了。連結上簡單的一句話也是一個範例:
For instance, the Scala library defines a value Nil of type
List[Nothing]. Because lists are covariant in Scala, this makes
Nil an instance of List[T], for any element type T.
可以先看到 List 的定義:
sealed abstract class List[+A]
extends Seq[A] with Product
先不用管 Seq[A] 和 Product 是什麼,這邊的 List[+A] 表示 list 有一個
covariant subtype relationship, 意思是假使 Integer 是 Object 的
subtype, 則 List[Integer] 也會是 List[Object] 的 subtype.
因此我們定義 Nil 是 List[Nothing] 的 singleton object:
case object Nil
extends List[Nothing]
而由於 Nothing 是所有 type 的 subtype, 所以 List[Nothing] 也是
所有 List[T] 的 subtype. 這意味著儘管我們有無窮多種 List[???],
但是這些 List 的 empty/base value, whatever, 只有一個,就是 Nil.
因此我們可以寫:
val any: List[Any] = Nil // Java 語法的話:List[Any] any = Nil
也可以寫:
val int: List[Int] = Nil // Java 語法的話:List[Int] int = Nil
因為 Nil 是 List[Nothing] 的 instance, 而 List[Nothing] 是
List[Any] 的 subtype, 也是 List[Int] 的 subtype.
ref:
http://www.scala-lang.org/node/128
==
文件滿完整的哩,改天來玩玩看...
另外還有個 JVM 語言是 Clojure, http://clojure.org/
這是 Lisp 的變種,最近好像滿流行的。
不過用起來的感覺我覺得有點怪,Scala 比較漂亮...
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
板名再換一下,說真的,有個版叫 PLT... XD