2013-09-27 2 views
1

우리가 인터페이스에 정적 메서드를 정의하지 못할 이유는 followoing 코드구현합니다 방법은

interface MyInterface{ 
    void method(String s);// if we write static modifier we have compile error 
} 
class MyClass implements MyInterface{ 
    public static void main(String[] args){ 
     myMethod(new Object());//Compile error 
    } 
    static void method(String s){...}// compile error 
    static void myMethod(Number n){...} 

} 
  1. 을 고려 캐스트?
  2. 정적 수정자를 사용하여 method()을 구현할 수없는 이유는 무엇입니까?
  3. Object를 참조하여 myMethod를 호출 할 때 컴파일 오류가 발생합니다. 내가 이해했듯이 컴파일러는 자동으로 캐스팅하지 않는다.
  4. 다음 코드 우리가이 경우에 Number로 캐스팅 할 때하고있는 어떤 컴파일러

    Object someObj; ... Number n= (Number) someObj;

을 고려?

+0

[인터페이스 메소드를 공개로 선언해야하는 이유] (http://stackoverflow.com/questions/9614708/why-should-we-declare-interface-methods-as-public) – Smit

+2

@ 다른 주제를 전달하십시오. 이 질문과 관련이 없습니다. –

+0

몇 가지 질문을하고 있습니다. 각 질문은 별도로 질문해야합니다. 첫 번째는 [인터페이스에서 정적 메서드를 선언 할 수없는 이유는 무엇입니까?] (http://stackoverflow.com/q/21817/1281433). –

답변

4

실패 캐스팅하지 않습니다?

모든 인터페이스 방법은 기본적으로 public abstract입니다. static 수정자를 사용하는 것은 의미가 없습니다. 정적 메서드의 호출은 다형성이 아니기 때문에 그 의미에서, 당신은 그들을 무시할 수 없습니다. 클래스 이름에서만 정적 메서드를 호출합니다. 글쎄, 당신은 너무 일부 참조를 호출 할 수 있지만 궁극적으로 참조의 선언 된 유형을 기반으로 해결됩니다. 이제이 메소드는 기본적으로 abstract이므로 호출하는 것은 의미가 없습니다. 어떤 일을 할 몸이 없습니다.

정적 수정자를 사용하여 method()를 구현할 수없는 이유는 무엇입니까?

static 한정자를 재정의 된 메서드에 추가하려고하면 재정의중인 것으로 간주되지 않습니다. 따라서 클래스에는 기본적으로 동일한 이름, 동일한 매개 변수 및 동일한 반환 유형의 두 가지 메서드가 있습니다. 물론 수업 시간에는 허용되지 않습니다.

public 수정자를 클래스의 재정의 메소드에 명시 적으로 추가해야합니다. 그렇지 않으면 코드가 컴파일되지 않습니다. 그 이유는 하위 클래스에서 재정의 된 메서드의 가시성을 줄일 수 없기 때문입니다.

Object를 참조하여 myMethod를 호출 할 때 컴파일 오류가 발생합니다. 내가 이해했듯이 컴파일러는 자동으로 캐스팅하지 않는다.

Jave는 자동 축소 변환을 수행하지 않습니다. 명시 적으로 캐스트를 추가해야합니다. 그러나 허용되는 경우에도 하위 클래스 참조로 수퍼 클래스 객체를 참조하려고하기 때문에 코드가 어떻게 동작 할 것으로 기대합니까? 당신은 물론 당신의 코드는 메소드를 호출하는 동안 캐스트를 추가하여 컴파일 할 수 있습니다 :

myMethod((Number)new Object()); // This will compile, but fail at runtime 

위의 호출이 런타임에 ClassCastException가 발생합니다. 마지막으로

Object obj = new Integer(5); 
Number num = (Number)obj; // This is fine. Because `obj` is referring to an `Integer`. 

그리고, 당신의 main의 서명 : 당신이 Number의 서브 클래스의 객체에 Object 참조 다스 려가있는 경우

그러나, 당신은 형 안전합니다 명시 적 캐스트를 추가 할 수 있습니다 방법이 올바르지 않습니다. public 수정자가 없습니다.

+0

Java 8 *의 인터페이스는 정적 메소드를 가질 수 있습니다. – arshajii

+0

@arshajii. 예, Java 8에는 기본 메소드가 있지만, OP가 Java 8을 아직 사용하지 않는다고 가정 할 때 고려하지 않습니다. –

+0

@Rohit Jain'Number'로 형변환하면 어떤 일이 생깁니 까? : Object obj = new Integer (5); Number num = (Number) obj;'귀하의 예에서? 컴파일러는'Number'에 대한 참조로'(Number) obj'를 파싱합니까? –

2

왜 인터페이스에서 정적 메소드를 정의 할 수 없습니까?

인터페이스는 기본적으로 다형성을 사용하도록 설계되었습니다. 다형성 인터페이스에서 정적 메서드를 호출 할 때 호출 할 구현을 어떻게 알 수 있습니까?

// Should that invoke MyClass.method or MyOtherImplementation.method? 
MyInterface.method("foo"); 

다음 :

왜 우리가 정적 수정과 구현 방법을() 캔트?

아이디어는 인터페이스를 구현하는 개체에 대해 메서드가 호출되므로 인스턴스 메서드가됩니다.

Object를 참조하여 myMethod를 호출 할 때 컴파일 오류가 발생합니다. 내가 이해했듯이 컴파일러는 자동으로 캐스팅하지 않는다.

아니요, 컴파일러는 자동으로 변환하지 않습니다. Object에서 Number으로의 암시 적 변환이 없으므로 Object 유형의 인수를 사용하여 Number 유형의 매개 변수가있는 메소드를 호출 할 수 없습니다.

이 경우 Number로 변환 할 때 컴파일러는 무엇을 수행합니까?

someObj의 값 또는 널 Number 또는 서브 클래스의 인스턴스에 대한 참조이거나 검증있다. JDK7까지

0

:

  1. 정적 메서드는 클래스에 바인드 때문이다. 당신은 보통 다음과 같이 그들을 호출합니다 :

    MyClass.method(""); 
    

    무시할 수 없습니다.

  2. 1을 참조하고 모든 인터페이스 방법은 public abstract입니다. 변경할 수 없습니다!

  3. 어떤 컴파일러는 자동으로

  4. 그는 캐스팅을 시도하고 우리가 인터페이스에 정적 메서드를 정의하지 못할 이유

관련 문제