İki arayüzünüz olduğunu varsayalım:
interface Readable {
public void read();
}
interface Writable {
public void write();
}
Bazı durumlarda, uygulama nesneleri bunlardan sadece birini destekleyebilir, ancak çoğu durumda uygulamalar her iki arabirimi de destekler. Arayüzleri kullanan insanlar şöyle bir şey yapmak zorunda kalacaklar:
// can't write to it without explicit casting
Readable myObject = new MyObject();
// can't read from it without explicit casting
Writable myObject = new MyObject();
// tight coupling to actual implementation
MyObject myObject = new MyObject();
Bu seçeneklerin hiçbiri son derece kullanışlı değildir, hatta bunu bir yöntem parametresi olarak istediğinizi düşünürken daha da fazladır.
Bir çözüm bir sarma arabirimi bildirmek olacaktır:
interface TheWholeShabam extends Readable, Writable {}
Okunabilir ve Yazılabilir hem destekleyen tüm uygulamaları: Ama bu belirli bir sorunu var olması onlar arabirimini kullanan kişilerle uyumlu olmasını istiyorsanız TheWholeShabam uygulamaktır. Her iki arayüzün garantili varlığından başka bir şey sunmasa da.
Bu sorunun temiz bir çözümü var mı yoksa sarıcı arabirimi için gitmeli miyim?
GÜNCELLEME
Aslında hem okunabilir hem de yazılabilir bir nesneye sahip olmak genellikle gereklidir, bu nedenle argümanlardaki endişeleri ayırmak her zaman temiz bir çözüm değildir.
Update2
(yorum olarak daha kolay cevap olarak çıkarılır)
Update3
Lütfen bunun için birincil kullanıcı tabanının akış olmadığına dikkat edin (bunlar da desteklenmelidir). Akarsu, girdi ve çıktı arasında çok belirgin bir ayrım yapar ve sorumlulukların arasında net bir ayrım vardır. Bunun yerine, yazabileceğiniz ve okuyabileceğiniz bir nesneye, kendisine çok özel bir duruma sahip bir nesneye ihtiyaç duyduğunuz bir bytebuffer gibi bir şey düşünün. Bu nesneler vardır, çünkü asenkron I / O, kodlamalar, ...
Update4
Denediğim ilk şeylerden biri, aşağıda verilen öneriyle aynıydı (kabul edilen cevabı kontrol edin), ancak çok kırılgan olduğu kanıtlandı.
Diyelim ki türü döndürmesi gereken bir sınıfınız var:
public <RW extends Readable & Writable> RW getItAll();
Bu yöntemi çağırırsanız, genel RW nesneyi alan değişken tarafından belirlenir, bu nedenle bu var.
MyObject myObject = someInstance.getItAll();
Bu işe yarayacaktır, ancak bir kez daha bir uygulamaya bağlar ve aslında çalışma zamanında sınıf ifadeleri atabilir (döndürülene bağlı olarak).
Buna ek olarak, RW türünde bir sınıf değişkeni istiyorsanız, sınıf düzeyinde genel tanımlamanız gerekir.