Diberi jenis eksistensial
T = ∃X.{op₁:X, op₂:X→boolean}
dan antarmuka Java generik ini:
interface T<X> {
X op₁();
boolean op₂(X something);
}
Apa perbedaan mendasar antara tipe eksistensial dan antarmuka Java?
Jelas ada perbedaan sintaksis, dan orientasi objek Java (yang juga mencakup rincian seperti this
parameter tersembunyi dll.). Saya tidak begitu tertarik pada ini sebagai perbedaan konseptual dan semantik - meskipun jika seseorang ingin menjelaskan beberapa poin yang lebih baik (seperti perbedaan notasi antara T
vs T<X>
), itu akan dihargai juga.
java
interfaces
type-systems
stakx
sumber
sumber
Jawaban:
Hmm ... Definisi itu terlihat sangat mirip dengan beberapa sampel haskell yang pernah saya lihat sejak lama.
Ketika konstruktor
X
diterapkan ∀ sebenarnya menjadi ∃. Perhatikan bahwa ketika Anda mengeluarkanvalue
Anda tidak tahu jenis dan memiliki set operasi kosong di atasnya. Tapi karenaviewValue
agak koheren denganvalue
itu dapat diterapkan padanya.Saya kira perbedaan utama dari Java
interface
Anda diusulkan adalah kenyataan bahwa Anda harus mengetahui jenis perantara untuk hasil kelulusan dariop₁
keop₂
. Yaitu sistem yang tepat untuk tipe eksistensial harus memilih tipe yang tepat yang dijamin ada kondisinya. Yaitu Anda harus bisa menulis fungsi dengan jenis:∀X. X→(X→boolean)→T
. Dalam contoh sebelumnya fungsi tersebut adalahX
konstruktor yang digunakan diX 3 show
(show
adalah fungsi yang mengambil argumen dari semua jenis yang mengimplementasikanShow
dan mengembalikanString
)Diperbarui: Saya baru saja membaca kembali pertanyaan Anda dan saya pikir saya punya konstruksi yang tepat untuk Java:
Anda benar tentang menyebutkan
this
- itu sebenarnya op₁ Anda.Jadi saya kira saya mengerti sekarang bahwa bahasa OOP klasik (Java, C #, C ++ dll) selalu menerapkan tipe eksistensial dengan nilai tunggal
this
dan fungsi di atasnya disebut "metode" yang secara implisit disebut dengan nilai itu :)PS Maaf, saya tidak terlalu terbiasa dengan Java, tapi saya harap Anda punya idenya.
sumber
Satu-satunya perbedaan adalah bahwa antarmuka Java sebenarnya berarti sesuatu ke kompiler Java.
Tipe eksistensial adalah definisi formal dari suatu tipe, tidak spesifik untuk bahasa apa pun. Ilmuwan komputer menggunakan definisi semacam ini untuk membuktikan hal-hal tentang jenis dan tentang bahasa yang menerapkannya. Antarmuka Java adalah salah satu implementasi Java dari tipe yang didefinisikan secara formal.
sumber
2 tipe yang disajikan sangat berbeda satu sama lain. Definisi antarmuka yang Anda tulis adalah tipe universal (Java generics pada umumnya termasuk dalam kategori ini).
Tipe eksistensial menyembunyikan tipe dalam implementasinya dari konsumen. Secara intuitif, agar X ada dalam T, identitas X tidak dapat diketahui dari konsumen mana pun; semua yang harus diketahui adalah serangkaian operasi yang diberikan pada definisi. Ada satu tipe T untuk beberapa tipe X.
Sebaliknya, tipe universal mendefinisikan operasi yang berlaku untuk semua tipe, dari mana konsumen bebas memilih. Tipe antarmuka T persis seperti itu. X dipakai oleh konsumen, yang akan tahu persis tipe X mana. Ada tipe T untuk setiap tipe X di alam semesta.
Keberadaan sebenarnya tidak hadir di Jawa sebagai bahasa konstruksi, kecuali untuk kasus wildcard terbatas (
List<?>
). Tapi ya, mereka dapat ditiru dengan antarmuka. Masalahnya kemudian menjadi lebih dari desain.Seperti yang ditunjukkan, dalam pengaturan berorientasi objek, eksistensial menjadi sulit untuk diterapkan karena cara Anda biasanya menyandikan informasi tipe X (yang dapat Anda lakukan dengannya) adalah memiliki fungsi anggota dalam tipe antarmuka yang diimplementasikan X. Singkatnya, antarmuka dapat membeli beberapa jenis kemampuan abstraksi, tetapi memerlukan penghapusan eksistensial sampai batas tertentu.
sumber