2017-11-24 1 views
1

내가 몇 가지 클래스가있는 경우 : 나는 그것을에 대한 코드를 내장 한 바이너리 및 다른 사람으로이 컴파일 한 경우반환 유형을 엄격한 하위 유형으로 변경하고 이진 호환성을 유지할 수 있습니까?

import java.util.Date; 
public final class Foo { 
    private Date date; 
    public Date getDate(){ return date; } 
} 

, I 이후 이진 호환성을 깨지 않고이 작업을 수행 할 수 있습니다? java.sql.Datejava.util.Date의 서브 클래스입니다

import java.sql.Date; 
public final class Foo { 
    private Date date; 
    public Date getDate(){ return date; } 
} 

참고.

그것은 내가 최종 클래스를 선언하지 않았다면, 내가 그에게 분명한 것 같다, 나는이 깨진 것 소스 호환성 (즉, 누군가가 이전에 내 라이브러리에 대해 java.util.Date를 반환하는 getDate 메소드를 오버라이드 (override) Foo의 서브 클래스를 컴파일 할 수; 그 코드는 더 이상 을 내 최신 버전과 비교하면 컴파일되지 않습니다. 하지만 소스 호환성이 깨지면 바이너리 호환성도 손상된다는 것을 의미합니까? java.sql.Datejava.util.Date 것을 어떤 행동을 중단 않는다고 가정 -

+0

[호환성 점검 도구] (https://lvc.github.io/japi-compliance-checker/)를 실행하여 수행 여부를 확인할 수 있습니다. –

+0

어떤 종류의 바이너리 호환성을 찾고 있습니까? 컴파일 된 것, 대체되는 것은 무엇입니까? 어떻게로드합니까? –

답변

0

그것의 서브 클래스에 대해 계속 제대로 작동해야 java.util.Date에 대해 작동 당신이 코드를 (즉, 같은 스칼라로, 다른 언어로 보유하지 않습니다).

특히 java.sql.Date은 (예 : getHours())의 몇 가지 재정의 폐기 된 방법에 java.lang.IllegalArgumentException을 던집니다. 당신이 피곤할 것 같은 한 가지 방법은 현대 자바 응용 프로그램에서 매우 유용 할 수도있는 toInstant()이지만 java.lang.IllegalArgumentExceptionjava.sql.Date에 던졌습니다.

+0

이것은 바이너리 호환성과 동일하지 않습니다.'getDate'를 호출 할 때'LinkageError' 또는'NoSuchMethodError'를 던지는 새 라이브러리에 대해 실행되는 코드에 대해 우려하고 있습니다. –

0

가장 좋은 방법은 직접 테스트하는 것입니다. 다음은 공식 documentation의 일부 발췌입니다.

13.4.15입니다. 메소드의 결과 유형

방법의 결과 유형을 변경하거나 무효로 결과 유형을 대체 또는 결과 유형으로 공백을 대체는 의 결합 효과 기존의 방법을 삭제하고있는 새 방법을 추가있다 새로운 결과 유형 또는 새로 보이드 결과 (§13.4.12 참조).

13.4.12

. 클래스에서 메서드 나 생성자를 삭제하는 방법 및 생성자 선언

이 방법 또는 생성자를 참조 된 기존의 바이너리 호환성 을 깰 수있다; 기존의 바이너리와 같은 참조 번호 이 링크되면 NoSuchMethodError가 발생합니다. 이러한 오류는 일치하는 서명과 반환 유형이 수퍼 클래스에서 선언 된 경우에만 발생합니다.

나는 이것이 당신이 반환 유형을 변경하는 경우, 그것은 오래된 유형의 하위 유형 인 경우에 상관없이, 당신은 13.4에 따라 기존의 방법을 삭제하고 새로운 방법을 추가하고하는 것을 의미한다는 것입니다 읽기 방법.12은이 메서드 또는 생성자를 참조하는 기존의 이진 파일과의 호환성을 깨기도합니다 ( ).

관련 문제