看板 java 關於我們 聯絡資訊
板名再換一下,說真的,有個版叫 PLT... XD ※ 引述《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