Solusi umum adalah dengan memperkenalkan tipe baru. Ini mungkin lebih terlibat, tetapi memiliki keuntungan bekerja untuk semua jenis yang tidak menentukan ketidakterbatasannya sendiri.
Jika T
adalah tipe yang lteq
didefinisikan, Anda dapat mendefinisikan InfiniteOr<T>
dengan lteq
sesuatu seperti ini:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
Saya akan menyerahkannya kepada Anda untuk menerjemahkan ini ke sintaks Java yang tepat. Saya berharap idenya jelas; tapi biarkan aku mengejanya.
Idenya adalah untuk membuat tipe baru yang memiliki semua nilai yang sama dengan beberapa tipe yang sudah ada, ditambah satu nilai khusus yang — sejauh yang dapat Anda katakan melalui metode publik — bertindak persis seperti yang Anda inginkan untuk bertindak tanpa batas, misalnya lebih besar dari ada yang lain. Saya menggunakan null
untuk merepresentasikan infinity di sini, karena itu tampaknya yang paling mudah di Java.
Jika Anda ingin menambahkan operasi aritmatika, putuskan apa yang harus dilakukan, lalu terapkan. Ini mungkin paling sederhana jika Anda menangani kasus tak hingga terlebih dahulu, kemudian menggunakan kembali operasi yang ada pada nilai hingga dari tipe asli.
Mungkin ada atau mungkin tidak ada pola umum tentang manfaat atau tidaknya mengadopsi konvensi penanganan infinitas sisi kiri sebelum infinitas sisi kanan atau sebaliknya; Saya tidak tahu tanpa mencobanya, tetapi untuk kurang dari atau sama ( lteq
) saya pikir lebih mudah untuk melihat infinity sisi kanan terlebih dahulu. Saya perhatikan bahwa lteq
ini tidak komutatif, tetapi add
dan mul
adalah; mungkin itu relevan.
Catatan: mendapatkan definisi yang baik tentang apa yang seharusnya terjadi pada nilai tak terbatas tidak selalu mudah. Ini untuk perbandingan, penjumlahan dan perkalian, tapi mungkin bukan pengurangan. Juga, ada perbedaan antara bilangan kardinal dan ordinal tak terhingga yang mungkin ingin Anda perhatikan.