2009-09-30 16 views
46

Java ile bunu yapmak yasal: Ben bu (değil yasal sözdizimi) nasıl yapabilirimBirden çok arabirimi uygulamak için Java'da bir yöntem bağımsız değişkenine nasıl gerek duyarım?

void spew(Appendable x) 
{ 
    x.append("Bleah!\n"); 
} 

:

void spew(Appendable & Closeable x) 
{ 
    x.append("Bleah!\n"); 
    if (timeToClose()) 
     x.close(); 
} 

mümkünse her ikisi nesneleri kullanmak arayanları zorlamak istediğim Belirli bir tür gerektirmeden Uygulanabilir ve Kapatılabilir. Bunu yapan birçok standart sınıf vardır, örn. BufferedWriter, PrintStream vb

Ben kendi arayüzü tanımlarsanız

anlamıyorum sürece benim arabirimini AppendableAndCloseable (uygulamak gerekmez appendable kapanan uygulamak standart sınıflar beri çalışmaz

interface AppendableAndCloseable extends Appendable, Closeable {} 

Java'nın yanı sıra, bence ... boş arayüzler, süper-arayüzlerinin üstünde ve ötesinde bir teklik katarlar).

Aklıma yakın aşağıdakilerden birini yapmak için:

  1. bir arabirim (örneğin appendable) almak ve bağımsız değişken bir instanceof diğerleri sağlamak için çalışma zamanı testleri kullanılabilir. Downside: Sorun derleme zamanında yakalanmadı.

  2. birden fazla argüman gerektirir (yakalar doğruluğunu derleme zamanı ama salakça görünüyor):

    void spew(Appendable xAppend, Closeable xClose) 
    { 
        xAppend.append("Bleah!\n"); 
        if (timeToClose()) 
         xClose.close(); 
    } 
    
+1

Bu kesinlikle eksiktir. Ama sorunuz tam olarak nedir? – NawaMan

cevap

78

Sen jenerik ile bunu yapabileceğimi:

public <T extends Appendable & Closeable> void spew(T t){ 
    t.append("Bleah!\n"); 
    if (timeToClose()) 
     t.close(); 
} 

Kişisel sözdizimi oldu neredeyse hakkı , aslında.

+0

aha! Yaşa! :-) –

+0

Bu, aynı zamanda işler için de işe yarıyor mu? Bir parametre nesnesinin serialzable olması için uğraşmaya çalışıyorum? – Zapnologica

+1

@Zapnologica: Bir arayüz uygulamak için? Hayır, arabirimde bildirilen genel bir parametreye ek tür kısıtlamaları koyamazsınız. –

İlgili konular