인터페이스에서 정적 메서드를 선언할 수 없는 이유는 무엇인가요?

정적 메서드를 인터페이스에서 선언할 수 없는 이유는 무엇일까요?

public interface ITest {
    public static String test();
}

위의 코드는 다음과 같은 오류를 발생시킵니다(적어도 이클립스에서는): "인터페이스 메서드 ITest.test()에 대한 잘못된 수정자; 공개 및 추상만 허용됩니다".

질문에 대한 의견 (7)
해결책

몇 가지 현안에 놀이를하고 삽입하십시오. 첫 번째는 호관련 정적 메서드는 선언 없이 정의합니다. 이 차이는

public interface Foo {
  public static int bar();
}

public interface Foo {
  public static int bar() {
    ...
  }
}

첫 번째는 [에스포] [1] 언급을 하는 이유 때문이다. # 39, 올바른 정의를 구현하고 있는 클래스는 너회가 don& 수 있을지 알 수 없다.

  • Java*를 rmw 수 있습니다. 자바 가상 머신 (jvm) 에 있으며, 사실, 8, 않니다 시작!

[1]: https://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods-in-an-interface # 21826

해설 (4)

인터페이스에 정적 메서드를 가질 수 없는 이유는 Java가 정적 참조를 해결하는 방식에 있습니다. Java는 정적 메서드를 실행하려고 할 때 클래스의 인스턴스를 찾으려고 애쓰지 않습니다. 정적 메서드는 인스턴스 종속적이지 않으므로 클래스 파일에서 바로 실행할 수 있기 때문입니다. 인터페이스의 모든 메서드가 추상적이라는 점을 감안할 때, 정적 메서드를 실행할 수 있는 코드를 찾기 위해 VM은 인터페이스의 특정 구현을 찾아야 합니다. 이는 정적 메서드 해결의 작동 방식과 모순되며 언어에 불일치를 초래할 수 있습니다.

해설 (3)

예를 들어 질문에 답해드리겠습니다. 정적 메서드 add가 있는 Math 클래스가 있다고 가정해 봅시다. 이 메서드를 다음과 같이 호출할 수 있습니다:

Math.add(2, 3);

Math가 클래스가 아닌 인터페이스였다면 정의된 함수를 가질 수 없습니다. 따라서 Math.add(2, 3)와 같이 말하는 것은 의미가 없습니다.

해설 (0)

있다, 그 이유는 디자인 때문이다. jave 다중 상속 허용하지 않습니다. 다중 상속 문제를 통해 알 수 있습니다 다음 예:

public class A {
   public method x() {...}
}
public class B {
   public method x() {...}
}
public class C extends A, B { ... }

이제 전화하시기 C. x () 어떻게 될까요? X () () 또는 발스 적립율은 A. 실행됨을? 이 문제를 해결할 수 있는 다중 상속 모든 언어가 있다.

자바 가상 머신 (jvm) 에 허용하시겠습니까 인터페이스와도 일종의 제한되었거나 다중 상속. 이 문제를 방지하려면 않는 이상, 가질 수 있습니다. 같은 문제를 보면 정적임 인터페이스 및 방법:

public interface A {
   public static method x() {...}
}
public interface B {
   public static method x() {...}
}
public class C implements A, B { ... }

여기에 동일한 문제가 발생할 경우, 어떤 전화하시기 C. x ()?

해설 (7)

정적 메서드는 인스턴스 메서드가 아닙니다. 인스턴스 컨텍스트가 없으므로 인터페이스에서 구현하는 것은 의미가 없습니다.

해설 (0)

지금 심지어 정적임 방법으로 정의할 수 있게 Java8 인터페이스입니다.

interface X {
    static void foo() {
       System.out.println("foo");
    }
}

class Y implements X {
    //...
}

public class Z {
   public static void main(String[] args) {
      X.foo();
      // Y.foo(); // won't compile because foo() is a Static Method of X and not Y
   }
}

참고: 이런 경우 기본적으로 우리는 여전히 추상적인 방법으로 인터페이스를 사용할 수 있도록 기본 / t # 39, 명시적으로 don& 여러_키워드 기본 방법 및 정적 메서드는 정적 응답.

해설 (0)

39 의 there& 매우 좋은 및 간단한 질문 답변을 [here] [1]. (이 맞은 것처럼 나를 그런 아주 잘 직설적으로 설명하는 것이 https://partner. 여기에서 I want to it.)

[1]: # 370967 https://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java/370967

해설 (1)

정적 메서드에 인터페이스입니다 [jave 8] 에서 볼 수 있는 것 같다 (http://www.techempower.com/blog/2013/03/26/everything-about-java-8/) 에, 뭐, 그냥 내 솔루션은 정의하십시오 내부 구분된다.

interface Foo {
    // ...
    class fn {
        public static void func1(...) {
            // ...
        }
    }
}

같은 기법을 주석입니다) 에서도 사용할 수 있습니다.

public @interface Foo {
    String value();

    class fn {
        public static String getValue(Object obj) {
            Foo foo = obj.getClass().getAnnotation(Foo.class);
            return foo == null ? null : foo.value();
        }
    }
}

항상 액세스되는 인터페이스윈프노스 '대신' 안쪽 클래스용 형태로 클라세이프니컬러스 폐기할 수 있습니다 '다음' 모호한 문제다.

해설 (0)

다형성 사용할 수 있는 인터페이스입니다 qic 오브젝트에도 추상형데이터타입 없습니다. 따라서 정적임 인터페이스 구성 요소를 갖고 있기 때문에 (앞서 설명한 것처럼) 아무런 의미가 없습니다.

해설 (1)

그러나 정적 메서드에 인터페이스입니다 인도하심이라만일 jave 8 세상을 바꿀 수 있는 제공하십시오 docname 구축 할 수 있습니다.

public interface StaticMethodInterface {
public static int testStaticMethod() {
    return 0;
}

/**
 * Illegal combination of modifiers for the interface method
 * testStaticMethod; only one of abstract, default, or static permitted
 * 
 * @param i
 * @return
 */
// public static abstract int testStaticMethod(float i);

default int testNonStaticMethod() {
    return 1;
}

/**
 * Without implementation.
 * 
 * @param i
 * @return
 */
int testNonStaticMethod(float i);

}

해설 (0)

이후 정적 메서드는 상속됨 수 없습니다. 그래서 전혀 사용하지 않음) 에 배치하여 인터페이스입니다. 기본적으로 모든 가입자의 인터페이스입니다 계약을 준수해야 한다. 정적 메서드에 인터페이스입니다 강제 시행할 것이라고 것도 가능하다. 지금 있는 것은 되고 있다는 사실을 정적 메서드는 상속됨 수 없습니다.

해설 (1)

불법 조합을 수정자는: 정적 및 요약

만약 한 멤버가 같이 선언된 클래스의 정적 클래스 이름을 함께 사용할 수 있습니다, 한정돼 있는 해당 클래스의 객체를 만들지 않고.

멤버 로 선언된 클래스의 경우, 추상 클래스) 로 선언해야 합니다 요약 제공해야 할 때 그 이행을 추상 클래스 멤버 중 상속됨 (하위).

추상 클래스의 멤버 구축현 제공해야 합니다 수 있는 동작은 정적 메서드는 하위 where you are 변화를 가져 올 수 있는 지역에 따라, 또한 기본 클래스, 이는 정확하지 않은 추상적인 선언

해설 (1)

&gt. Java 8, 정적 메서드는 인터페이스와도 함께 할 수 있게 되었습니다.

예를 들어, 비교자 정적임 나투라로더 () 는 메서드입니다.

인터페이스를 구현할 수 있는 여유가 되었습니다 요구 사항을 포함할 수 없습니다. 이제 인터페이스와도 너희가운데 &quot default"; 일반 구현을 통해 구현할 수 있는 방법, 마치 하나의 예외: 의 경우 둘 다 기본 구축 및 수직 인터페이스입니다 상속됩니다 수퍼 superclass& # 39 에서 구현, s 는 항상 시행하십시오 구축현 우선_순위.

해설 (3)

아마도 a, C #, # 39 m, 코드 예 보호하리요 I& 사용하려는 확장하지만 따라 준수하십시오 수 있어야 합니다.

우리는 비헤이비어는 치라구요 인터페이스입니다 이페이이블 불렀으매

public interface IPayable
{
    public Pay(double amount);
}

이제 이 인터페이스를 구현하는 구체적인 클래스뿐만 2:

public class BusinessAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

public class CustomerAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

이제 우리는 취합은 계정임, 그렇게 하려면 사용할 수 있도록 치라구요 다양한 유형의 이페이이블 일반 목록

List accountsToPay = new List();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());

이제 우리가 원하는 모든 이들에게 50 달러 를 지불할 계정임:

foreach (IPayable account in accountsToPay)
{
    account.Pay(50.00);
}

이제 어떻게 인터페이스는 매우 유용합니다.

이들은 주로 인스턴스화됩니다 객체에는 뿐입니다. 아님 정적 클래스.

한 때 이슬람세를 정적임 했을 경우, # 39 의 IPayable& 통해 루프을 이스카운트스토페이 무리라구 강구해야 할 수 있을 경우, 호츨 이슬람세를 켜짐이 비즈니사카운트 또는 쿠스토메라코런트.

해설 (2)