2014-04-23 6 views
0

다음은 Java (1.7)에서 유효하지 않은 이유를 설명하십시오.인터페이스 메소드 - 구현 대 정의

인터페이스를 갖는

interface argument{} 

argument의 구현 :

class someArgument implements argument{} 

foo의 구현 :

argument 또한 인터페이스이다

interface foo { 
    mymethod(argument arg) 
} 

class bar implements foo { 
    mymethod(someArgument arg) {} 
} 

클래스 barmymethod이 구현되어 있지 않으므로 컴파일 오류가 발생합니다. 캐스팅의 필요성을 제외하고 위의 작업을 수행 할 여지가 있습니까?

감사합니다.

+0

무엇을 의미합니까? –

+0

그것은 쓰레기 일 수도 있고 늦은 시간 일 수도 있습니다.하지만 인터페이스 정의에서 논쟁의 유형에 대해 구체적으로 설명하지 않겠습니까? :) – Hoof

+4

제네릭과 함께. 재정의는 공변 매개 변수 목록을 허용하지 않습니다. –

답변

4

foo 인터페이스에 정의 된 exact이어야합니다.

argument을 구현하는 다른 클래스 (baz)가 있다고 가정합니다. 그런 다음 mymethod(argument arg) 서명은 baz 유형의 전달 매개 변수를 허용합니다.

하지만이처럼 유지하는 경우 :

class bar implements foo { 
    mymethod(someArgument arg) {} 
} 

당신이 계약을 파괴했기 때문에, mymethodbaz 인스턴스를 통과 할 수없는 것입니다.

보조 노트 개발시 naming conventions을 따라야합니다!

+0

True. 하지만 내 의도는 casting이 unnessescary가되도록 specifik 타입을 취하는 구체화를 만드는 것입니다 ... (인수 arg)를 사용하여 전달 된 인수 ("baz"또는 "someArgument")에 대한 "특정"구현 세부 사항을 놓친다. – Hoof

+0

어쨌든 인터페이스에서 메소드를 구현해야합니다. 그러나'someArgument' 인스턴스를 패러미터 (Paramer)로 취하는 또 다른 메소드로 오버로드 할 수 있습니다. Unfortunatelly, 모호성이 있기 때문에 (JVM은'someArgument'를 전달할 때 호출 할 메소드를 알 수 없기 때문에) 또한 작동하지 않을 것이다. 내가 만들 수있는 유일하지 않은 제네릭 솔루션은 메서드의 이름을 변경하고 특정 논리를 구현하는 것입니다. –

+0

위와 같이 주석 :이 설계 방법은 결함이있어 더 이상 추구해서는 안됩니다 :) 더 나은 해결책 (컴파일)을 찾을 것입니다! – Hoof

관련 문제