기본 방법은 무엇입니까?
Java 8이 릴리스 된 후 새로운 메소드를 인터페이스에 추가 할 수 있지만 인터페이스는 여전히 구현 클래스와 호환 될 수 있습니다. 개발 한 클래스 라이브러리는 여러 개발자가 널리 사용될 수 있기 때문에 매우 중요합니다. Java 8 이전에 클래스 라이브러리에서 인터페이스가 릴리스 된 후, 새로운 메소드가 인터페이스에 추가되면이 인터페이스를 구현하는 응용 프로그램은 인터페이스의 새 버전을 사용하여 충돌 할 위험이 있습니다.
Java 8을 사용하면 그러한 위험이 없습니까? 대답은 아니오입니다.
인터페이스에 기본 메소드를 추가하면 일부 구현 클래스를 사용할 수 없습니다.
먼저 기본 메소드의 세부 사항을 살펴 보겠습니다.
Java 8에서는 인터페이스의 메소드를 구현할 수 있습니다 (Java 8의 정적 메소드는 인터페이스에서도 구현 될 수 있지만 이것은 또 다른 주제입니다). 인터페이스에서 구현 된 메소드를 기본 메소드라고하며 키워드 기본값으로 수정 자로 식별됩니다. 클래스가 인터페이스를 구현하면 인터페이스에서 구현 된 메소드를 구현할 수 있지만 필요하지 않습니다. 이 클래스는 기본 메소드를 상속합니다. 인터페이스가 변경되면 구현 클래스를 변경할 필요가없는 이유입니다.
더 물려받을 시간은 어떻습니까?
클래스가 둘 이상의 (예 : 2 개) 인터페이스를 구현할 때 상황이 복잡해지고 이러한 인터페이스는 동일한 기본 메소드를 갖습니다. 클래스는 어떤 기본 메소드가 상속됩니까? 그들 중 누구도 아닙니다! 이 경우 클래스는 그 자체로 기본 메소드 (만)를 구현해야합니다 (트리의 고급 클래스를 직접 또는 상속).
한 인터페이스가 기본 메소드를 구현하고 다른 인터페이스는 기본 메소드를 추상적으로 선언 할 때도 마찬가지입니다. Java 8은 불분명 한 것을 피하고 엄격하게 유지하려고합니다. 여러 인터페이스에서 메소드가 선언되면 기본 구현이 상속되지 않으며 컴파일 타임 오류가 발생합니다.
그러나 클래스를 컴파일 한 경우 컴파일 타임 오류가 없습니다. 이 시점에서 Java 8은 일관성이 없습니다. 여러 가지 이유로 고유 한 이유가 있습니다. 나는 자세히 설명하거나 여기에서 깊이 논의하고 싶지 않습니다 (왜냐하면 버전이 출시되었고 토론이 너무 길었고이 플랫폼은 이와 같이 논의한 적이 없습니다).
위의 경우 클래스는 정상적으로 실행할 수 있습니다. 그러나 수정 된 인터페이스로 다시 컴파일 할 수는 없지만 오래된 인터페이스로 여전히 실행할 수 있습니다. 다음
두 인터페이스가 동일한 메소드에 기본 구현을 제공하는 경우 구현 클래스가 기본 메소드를 구현하지 않는 한이 메소드를 호출 할 수 없습니다 (구현을 위해 트리의 고급 클래스를 직접 구현하거나 상속).
그러나이 수업은 호환됩니다. 두 인터페이스에서 기본 구현이있는 메소드를 호출하지 않는 한 새 인터페이스로로드하거나 실행할 수도 있습니다.
예제 코드
위의 예를 보여주기 위해 아래 3 개의 하위 디렉토리가있는 C.java에 대한 테스트 디렉토리를 만들었습니다. 테스트 디렉토리에는 클래스 C의 C.java 소스 코드가 포함되어 있습니다. 기본 디렉토리에는 컴파일 및 실행할 수있는 버전의 인터페이스가 포함되어 있습니다. i1은 기본적으로 구현 된 m () 메소드를 포함하고 i2에는 어떠한 메소드도 포함하지 않습니다.
구현 클래스에는 기본 방법이 포함되어 있으므로 테스트에서 실행할 수 있습니다. 명령 줄 매개 변수가 있는지 확인하므로 M ()을 호출하는 테스트를 쉽게 실행하고 m ()을 호출 할 수 있습니다.
공개 클래스 C는 i1, i2 {public static void main (String [] args) {c c = new c ()를 구현합니다. if (args.length == 0) {cm (); }}} public interface i1 {default void m () {system.out.println ( "Hello Interface 1"); }} 공개 인터페이스 i2 {}다음 명령 줄을 사용하여 컴파일하고 실행하십시오.
Javac -cp. : Base C.javajava -cp. : Base Chello 인터페이스 1
호환 디렉토리에는 추상 메소드 m ()와 비정규 I1 인터페이스와의 i2 인터페이스가 포함되어 있습니다.
공개 인터페이스 i2 {void m ();}클래스 C를 컴파일하는 데 사용할 수 없습니다.
javac -cp. : 호환 c.javac.java:1 : 오류 : c는 추상적이지 않으며 i2public class c에서 초록 메소드 m ()을 무시하지 않습니다. i1, i2 { ^ 1 오류오류 메시지가 매우 정확합니다. 이전 컴파일에서 얻은 C.class가 있기 때문에 호환 디렉토리에서 인터페이스를 컴파일하면 구현 클래스를 실행할 수있는 두 개의 인터페이스가 표시됩니다.
Javac 호환/i*.javajava -cp. : 호환 chello 인터페이스 1
잘못이라고 불리는 세 번째 디렉토리와 I2 인터페이스가 포함되어 있습니다. M () 메소드도 정의합니다.
공개 인터페이스 i2 {default void m () {System.out.println ( "Hello Interface 2"); }}우리는 그것을 컴파일하는 데 피곤해서는 안됩니다. m () 메소드는 두 번 정의되지만 구현 클래스는 여러 번 정의 된 메소드를 호출하지 않는 한 여전히 실행될 수 있지만 m () 메소드를 호출하는 한 즉시 실패합니다. 우리가 사용하는 명령 줄 매개 변수는 다음과 같습니다.
Javac 잘못/*. Javajava -cp. : 스레드의 잘못된 C 예외 "Main"Java.lang.incompatibleclasschangeerror : 충돌 기본 방법 : CM (C.java)의 CM (C.java)에서 i1.m i2.m (C.java:5) Java -CP. : 잘못된 C x.
결론적으로
Java 8 환경에 대한 인터페이스에 기본 구현을 추가하는 클래스 라이브러리를 포트하면 일반적으로 아무런 문제가 없습니다. 적어도 이것은 수집 클래스에 기본 방법을 추가 할 때 Java8 클래스 라이브러리 개발자가 생각하는 것입니다. 클래스 라이브러리를 사용하는 응용 프로그램은 여전히 기본 메소드없이 Java7의 클래스 라이브러리에 의존합니다. 여러 다른 클래스 라이브러리를 사용하고 수정할 때는 갈등이 적습니다. 어떻게 피할 수 있습니까?
이전과 같이 수업 도서관을 디자인하십시오. 기본 메소드에 의존 할 때 가볍게 가져 가지 마십시오. 절대적으로 필요한 것으로 사용하지 마십시오. 다른 인터페이스와의 충돌을 피하려면 메소드 이름을 현명하게 선택하십시오. Java 프로그래밍 에서이 기능을 개발하는 방법을 배웁니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.