2009-06-23 29 views
29

Một chút cụ thể hơn so Stack Overflow câu hỏi What is an existential type?, sự khác biệt giữa Scala của loại hiện sinh và Java wildcard là gì, prefereably với một số ví dụ minh họa?Sự khác biệt giữa các loại tồn tại của Scala và ký tự đại diện của Java bằng ví dụ?

Trong tất cả mọi thứ tôi đã thấy cho đến nay, chúng có vẻ tương đương.

Một vài tham chiếu. Martin Odersky mentions them; top hit for my question của Google:

MO: Thiết kế wildcard gốc ... được lấy cảm hứng từ loại hiện sinh. Trong thực tế, giấy gốc đã có một mã hóa trong các loại tồn tại. Nhưng sau đó khi thiết kế cuối cùng thực tế xuất hiện trong Java, kết nối này bị mất một chút

+0

imho, fotNelton dường như thực hiện một số bổ sung có liên quan bị bỏ qua bởi những người khác, điều này thật thú vị khi biết thêm. Sẽ rất thú vị nếu có nửa thứ hai của câu giải thích rõ ràng hơn ... – ib84

Trả lời

13

Đây là câu trả lời Martin Odersky về việc Scala người sử dụng danh sách gửi thư:

Các loại Java wildcard gốc (như mô tả trong giấy ECOOP bởi Igarashi và Viroli) đã thực sự chỉ shorthands cho hiện sinh loại. Tôi đã nói và tôi đã đọc trong giấy FOOL '05 trên Wild FJ rằng phiên bản cuối cùng của các ký tự đại diện có một số khác biệt tinh tế với các loại hiện có . Tôi sẽ không biết chính xác theo ý nghĩa nào (hình thức của họ quá xa khỏi các loại tồn tại cổ điển là có thể xác định sự khác biệt), nhưng có thể đọc kỹ tờ giấy Wild FJ sẽ làm sáng tỏ nó.

Vì vậy, nó dường như rằng Scala loại hiện sinh và ký tự đại diện Java là loại-of tương đương

+2

Một liên kết đến toàn bộ cuộc hội thoại sẽ hữu ích nhất –

+0

Không có gì khác hơn thế này –

6

Chúng được cho là tương đương, vì mục đích chính của chúng là tương tác với các ký tự đại diện của Java.

+0

Tôi đã thêm nhận xét của Martin Odersky vào câu hỏi ban đầu của tôi. Đọc phản ứng của anh ta với Bill Venners, có vẻ như các kiểu tồn tại không tương đương với các ký tự đại diện. Chắc chắn, tôi khá chắc chắn tôi đọc một cái gì đó một trong khi trở lại về cơ bản puffing rằng Scala * không * có các loại ký tự đại diện (như nó ban đầu không) là một điều tích cực. –

+0

Ai đó đã chỉ ra với tôi rằng nó có lẽ là puffing thực tế là Scala không có * nguyên * loại –

+0

@oxbow_lakes, là 'Danh sách [_]' được coi là một danh sách thô trong Scala? –

6

Họ rất giống nhau nhưng loại hiện sinh của Scala được coi là mạnh hơn. Ví dụ, kiểu tồn tại của Scala có thể là cả upper và lower bounded trong khi ký tự đại diện của Java chỉ có thể được liên kết phía trên.

Ví dụ, trong Scala:

scala> def foo(x : List[_ >: Int]) = x 
foo: (x: List[_ >: Int])List[Any] 

foo có một danh sách các tham số mà có một giới hạn thấp hơn của Int.

4

Một cách hơn câu trả lời chi tiết bởi Martin Odersky (phần còn lại có thể được tìm thấy here):

Scala cần loại hiện sinh cho cơ bản ba điều. đầu tiên là chúng ta cần phải làm cho một số ý nghĩa của các ký tự đại diện của Java, và các kiểu tồn tại là ý nghĩa của chúng ta. Thứ hai là chúng tôi cần phải làm cho một số ý nghĩa của các loại nguyên liệu của Java, bởi vì họ cũng là vẫn còn trong các thư viện, các loại không được hợp nhất. Nếu bạn nhận được loại Java thô, chẳng hạn như java.util.List, đây là danh sách mà bạn không biết loại phần tử . Điều đó cũng có thể được biểu diễn trong Scala theo loại hiện có là .Cuối cùng, chúng ta cần các loại tồn tại như một cách để giải thích những gì đi trên trong máy ảo ở mức cao của Scala. Scala sử dụng mô hình tẩy xoá của generics, giống như Java, vì vậy chúng tôi không thấy các thông số loại nữa khi chương trình được chạy. Chúng ta phải xóa bỏ vì chúng ta cần để tương thích với Java. Nhưng sau đó điều gì sẽ xảy ra khi chúng tôi phản ánh hoặc muốn thể hiện những gì diễn ra trong VM? Chúng ta cần có thể đại diện cho những gì JVM sử dụng các loại chúng ta có trong Scala, và các kiểu tồn tại cho phép chúng ta làm điều đó. Họ cho phép bạn nói về các loại nơi mà bạn không biết các khía cạnh nhất định của các loại đó.

0

Các List[_] ký hiệu (mà như câu trả lời khác chỉ ra là một analog mạnh mẽ hơn để Java List[?]) là một trường hợp thoái hóa của more general notion của một loại tồn tại trong Scala.

Các vấn đề liên quan