인터페이스가 Java에서 여러 인터페이스를 확장 할 수 있습니까?


126

인터페이스가 Java에서 여러 인터페이스를 확장 할 수 있습니까? 이 코드는 내 IDE에서 유효하고 컴파일됩니다.

interface Foo extends Runnable, Set, Comparator<String> { }

그러나 Java에서 다중 상속이 허용되지 않는다고 들었습니다. 인터페이스에 예외가있는 이유는 무엇입니까?


3
어떤 기사는 불가능하다고 말합니까? 그들은 틀렸거나 잘못 이해했으며 인터페이스보다는 클래스에 대해 이야기하고 있습니다.

7
이 질문은 자기 연구에 의해 쉽게 답변 될 수 있기 때문에 주제를 벗어난 것으로 보입니다
JoseK

4
@StephenC 모순되는 기사를 찾은 경우 기사를 게시해야합니다. 그렇게하면 사람들은 그 기사를 읽지 않는다는 것을 알게됩니다 ...
저는 래퍼 클래스

10
이 질문에 대한 답변으로 시간이 절약되었습니다. 나는 그것이 유효한 질문으로 가치가 있다고 주장한다.
xdhmoore

6
유용한 질문, 나는 IDE가 경고를 던지기를 기대하면서 아무것도 보지 못해서 놀랐다. 그래서 나는 무의식적으로 Google에 op와 같은 질문을 입력하여 답변 / 확인과 함께이 페이지로 연결되었습니다
Arthur

답변:


170

예, 할 수 있습니다. 인터페이스는 다음과 같이 여러 인터페이스를 확장 할 수 있습니다.

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

단일 클래스는 여러 인터페이스를 구현할 수도 있습니다. 두 인터페이스에 동일한 이름과 서명을 정의하는 메소드가있는 경우 어떻게합니까?

까다로운 요점이 있습니다.

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

그런 다음 단일 구현이 모두 작동합니다 :).

내 전체 게시물을 읽으십시오.

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html


@RahulBhadana 추상 메소드가 올바르게 무시되어야합니까?
Suresh Atta

13
인터페이스 A가 void test()있고 인터페이스 B가 있는 경우 어떻게해야 boolean test()합니까? (이것은 다이아몬드 문제 의 사촌 입니까?) __ 반복하고 합리적인 일이 발생합니다. 반환 유형이 다른 경우 허용되지 않습니다.
Daniel

@sureshatta-어떻게됩니까? 둘 다 호출 합니까 ??
Fattie

4
클래스는 리턴 유형이 다른 두 개의 동일한 서명을 허용하지 않습니다. stackoverflow.com/questions/16149285/…
Ninh Pham

73

인터페이스여러 인터페이스를 확장 .

클래스는다중 인터페이스를 구현합니다 .

그러나 클래스단일 클래스확장 할 수 있습니다 .

당신이 단어를 사용하는 방법을주의 깊게 extendsimplements에 대해 이야기 할 때 interfaceclass.


8

인터페이스가 Java에서 여러 인터페이스를 확장 할 수 있습니까?

대답은 그렇습니다.

JLS 에 따르면

인터페이스는 하나 이상의 다른 인터페이스의 직접 확장으로 선언 될 수 있습니다. 즉, 숨길 수있는 멤버 유형 및 상수를 제외하고 확장하는 인터페이스의 모든 멤버 유형, 추상 메소드 및 상수를 암시 적으로 지정합니다.


JLS = "자바 언어 사양"은 이러한 질문의 권위있는 소스입니다.
Hontvári Levente

6

다중 상속 유형에 대한 Oracle 문서 페이지에서 정확한 답변을 찾을 수 있습니다 . 여기서 우리는 먼저 java에서 다중 상속 유형을 알아야합니다.

  1. 상태의 다중 상속.
  2. 구현의 다중 상속.
  3. 유형의 다중 상속.

Java는 다중 상태 상속을 지원하지 않지만 Java 8 릴리스 이후 기본 메소드를 사용한 다중 상속 구현과 인터페이스를 통한 다중 유형 상속을 지원합니다.

그런 다음 "다이아몬드 문제"에 대한 질문과 Java가 그 문제를 어떻게 처리하는지에 대한 질문이 발생합니다.

  1. 다중 상속 구현의 경우 Java 컴파일러는 컴파일 오류를 발생시키고 인터페이스 이름을 지정하여 사용자에게이를 수정하도록 요청합니다. 예를 들면 다음과 같습니다.

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }

인터페이스 D는 유형 B에서 method ()와 관련이없는 기본값을 상속하고 인터페이스 C는 B, C를 확장합니다.

다음과 같이 고칠 수 있습니다.

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. java 유형의 다중 상속에서 인터페이스는 변경 가능한 필드를 포함하지 않으며 하나의 구현 만 클래스에 속하므로 java는 문제를 일으키지 않으므로 그렇게 할 수 있습니다.

결론적으로 우리는 자바 말할 수있는 지원하지 않는 상태의 다중 상속을 하지만 지원하지 않습니다 구현 및 유형의 여러 상속 다중 상속을 .


1
나는 이것이 더 적합한 대답이라고 생각하며 질문에 대해 더 명확하게합니다. +1
Ketan Joshi

@KetanJoshi에게 감사드립니다. 이것은 많은 동기를 부여합니다 :)
shankar upadhyay

4

여러 개를 확장 Interfaces할 수 있지만 여러 개를 확장 할 수는 없습니다 classes.

Java에서 여러 클래스를 확장 할 수없는 이유는 이것이 가능한 C ++의 나쁜 경험 때문입니다.

다중 상속의 대안은 클래스가 여러 인터페이스를 구현하거나 인터페이스가 여러 인터페이스를 확장 할 수 있다는 것입니다.


2

나는 당신의 혼란이 다중 상속에 달려 있다고 생각합니다. 여기서는 나쁜 습관이며 Java에서는 이것이 불가능합니다. 그러나 Java에서는 여러 인터페이스를 구현할 수 있으며 안전합니다.


2

Java 클래스는 하나의 상위 클래스 만 확장 할 수 있습니다. 다중 상속은 허용되지 않습니다. 그러나 인터페이스는 클래스가 아니며 인터페이스는 둘 이상의 상위 인터페이스를 확장 할 수 있습니다.

예를 들어, 여기를보십시오 : http://www.tutorialspoint.com/java/java_interfaces.htm

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.