2009-09-30 8 views
46

그것은 자바에서이 작업을 수행하는 법률의 :이 (안 법률 구문을) 할 수있는 방법여러 인터페이스를 구현하기 위해 Java에서 메소드 인수를 요구할 수 있습니까?

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

:

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

가능하면 모두 객체를 사용하여 발신자를 강제로 내가 좋아하는 것 특정 유형을 요구하지 않고 추가 가능하고 닫기 가능합니다. 이렇게하는 표준 클래스가 여러 개 있습니다 (예 : BufferedWriter의,의 PrintStream 등

난 내 자신의 인터페이스를 정의하는 경우

이해하지 않는 한 내 인터페이스 AppendableAndCloseable을 (구현하지 않는 Appendable에와 닫기 가능한을 구현하는 표준 클래스 이후 작동하지 않습니다

interface AppendableAndCloseable extends Appendable, Closeable {} 

자바뿐만 아니라 내가 생각 ... 빈 인터페이스는 여전히 자신의 슈퍼 인터페이스를 넘어 고유성을 추가).

내가 생각할 수있는 가장 가까운 다음 중 하나를 수행하는 것입니다

  1. 는 하나의 인터페이스 (예를 들어, Appendable에)을 선택하고, 인수가 instanceof 다른 보장하기 위해 런타임 테스트를 사용합니다. 단점 : 컴파일 타임에 잡히지 않은 문제.

  2. 여러 인수가 필요 (어획량은 정확성 시간 컴파일하지만 dorky 모양) :

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

확실히 부족합니다. 그러나 귀하의 질문은 정확히 무엇입니까? – NawaMan

답변

78

당신은 제네릭을 할 수있는 :

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

귀하의 구문했다 거의 권리를 , 사실은.

+0

아하! 만세! :-) –

+0

이것도 구현 도구로 사용할 수 있습니까? 매개 변수 객체를 serialzable로 만들어야합니다. – Zapnologica

+1

@ Zapnologica : 인터페이스 구현을 위해? 아니요, 인터페이스에 선언 된 제네릭 매개 변수에 유형 제한을 추가 할 수 없습니다. –

관련 문제