2012-12-23 2 views
0

첫 번째 버전 :이 프로그램의 v1은 컴파일되지만 v2는 컴파일되지 않습니다. 디자인에 의한 것인가? 그렇다면 왜?

public interface DeepCopyable<T> 
{ 
    T deepCopy(); 
} 

public interface Statement extends DeepCopyable<Statement> 
{ 
} 

public interface Expression 
{ 
    Expression deepCopy(); // forgot I have an interface for this 
} 

public class Invocation implements Expression, Statement 
{ 
    public final String Field; 

    public Invocation(String field) 
    { 
    Field = field; 
    } 

    public Invocation deepCopy() 
    { 
    return new Invocation(Field); 
    } 
} 

두 번째 버전, 표현의 인터페이스 업데이트 :

public interface Expression extends DeepCopyable<Expression> 
{ 
} 

을하지만 지금은 내가이 오류 메시지를 이해할 수

Error: C:\temp\Invocation.java:1: DeepCopyable cannot be inherited with different arguments: <Expression> and <Statement> 

컴파일 오류를 얻을 일반적으로 수익 유형은 불변합니다. 그러나 반환 유형 A와 B를 사용하여 동일한 인터페이스를 두 번 상속하고 구현 메서드가 C를 반환하는 경우 C가 공분산이고 A와 B는 안전하지 않아야합니다.

+0

컴파일 오류가 없기 때문에 두 번째 버전의 전체 코드를 게시 할 수 있습니까? – ka3ak

답변

0

Invocation 클래스에서 두 개의 Interfaces Expression과 Statement를 확장하면 코드의 두 번째 버전에서 Expression 인터페이스가 아래 그림과 같이 DeepcCopyable 인터페이스를 확장합니다. 두 개의 인터페이스를 표현하고 다른 제네릭까지 연장되는 정책을 구현 할 때 코드에서

class Invocation implements Expression, Statement {...} 




interface Statement extends DeepCopyable<Statement> { 
} 

interface Expression extends DeepCopyable<Expression> { 
} 

가 무슨 일하는 것은, 여기에 무슨 일 때문에 당신이 모두를 구현하는 것을 허용하지 않을 것이다, 컴파일러는 무엇을 고려하는 것을 혼동 도착하다 인터페이스 Expression, 같은 클래스의 Statement

0

다른 매개 변수로 인터페이스를 두 번 구현할 수 없습니다. 그것은 두 번째 버전의 문제점입니다.

첫 번째 버전의 문제는 두 인터페이스가 모두 약간 다른 서명으로 deepCopy을 지정한다는 것입니다. 그러나 구현 된 서명은 두 가지 모두와 호환되므로 아무런 문제가 없습니다.

관련 문제