2012-05-14 3 views
1

중첩 클래스에 Java 문제가 있습니다.Java의 중첩 인터페이스에서 상속 된 정적 메서드로 중첩 정적 클래스를 정의하는 방법은 무엇입니까?

public class TopClass { 

    public void mainMethod() { 
     // uses the different "method" methods from 
     // NestedClass-implementing nested classes 
    }    

    private interface NestedClass { 
     public void method(); 
    }  

    private class NestedClass1 { 
     public void method() { 
     } 
    }  

    private class NestedClass2 { 
     public void method(){ 
     } 
    }  
} 

을하지만 지금은 그들이 주로해야하기 때문에 이러한 method() 방법은 정적하려면 :

내 최고 수준의 구조는 다음처럼 보였다.

정적 클래스에 넣지 않고 정적으로 만들 수는 없지만 문제는 없습니다. 클래스를 정적으로 만들었습니다. 어쨌든 있어야합니다.

public class TopClass { 

    public void mainMethod() { 
     // uses the different "method" methods from 
     // NestedClass-implementing nested classes 
    }    

    private static interface NestedClass { 
     public void method(); 
    }  

    private static class NestedClass1 { 
     public static void method() { 
     } 
    }  

    private static class NestedClass2 { 
     public static void method(){ 
     } 
    }  
} 

을하지만 문제는 시작 :

지금이 바로 것 같습니다. Eclipse에서이 메시지 This static method cannot hide the instance method from TopClass.NestedClass을 얻는 정적 메서드는 비 정적 인터페이스 메서드에서 올바르게 상속받지 않습니다.

Illegal modifier for the interface method method; only public & abstract are permitted 그래서 내가 추상 클래스의 생각이 시도 :

내가 인터페이스 방법은 정적 만들

, 그것은 나에게이 오류 제공

public class TopClass { 

    public void mainMethod() { 
     // uses the different "method" methods from 
     // NestedClass-implementing nested classes 
    }  

    private static abstract class NestedClass { 
     public static abstract void method(); 
    }  

    private static class NestedClass1 { 
     public static void method() { 
     } 
    }  

    private static class NestedClass2 { 
     public static void method(){ 
     } 
    }  
} 

그러나 다시를 보이는 추상적 인 방법이 될 수 없다 정적이라고 선언 : The abstract method method in type NestedClass can only set a visibility modifier, one of public or protected.

NestedClass1 & 2 : This static method cannot hide the instance method from TopClass.NestedClass의 메서드 메서드에서 오류를 제거합니다.

정적 방법을 다루기위한 일종의 선루를 선언 할 방법이 없습니까?

편집 : 문제점은 실제로 메소드에 대한 참조를 저장하기위한 Java의 가능성이 부족하다는 것을 해결하려고합니다. 그래서 대신에 나는 그 클래스들을 모두 한가지 방법으로 가지고 있지만 목록에 저장해야합니다. 그들은 상부 구조에 의해 "잡힐"수 있어야합니다. 익명의 클래스 나 열거 형을 시도하는 힌트를 얻었습니다. 이제 시도해보십시오.

+0

여기서 실제로 수행하려고하는 것은 무엇입니까? 의미있는 것은 중첩 된 클래스, 인터페이스 등을 넘어 실제 목표는 무엇입니까? 당신이 진짜 문제가 무엇이든간에 해결책을 너무 과소 평가하는 것처럼 보입니다. 정적 메쏘드를위한 인터페이스는 정적 메쏘드가 오직 선언/존재 * 한 번 *이므로 의미가 없습니다. –

+0

열거 (Enumeration)를 사용하여했습니다. 어떤 작품 잘 :) –

+0

"하지만 정적 클래스의 모든 메서드는 정적이라고 생각"- 아니 이것은 사실이 아니다. 중첩 클래스와 내부 클래스의 차이에 대해 혼란스러워한다고 생각합니다. [this] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) 및 [this] (http://stackoverflow.com/questions/70324/java-inner-class- static-nested-class) –

답변

2

정적 메서드 선언은 항상 정의 뒤에 와야합니다. 서브 클래스에서는 구현할 수 없습니다.

나는 당신이 문제에 올바르게 접근하지 못하고 있다고 생각합니다. 다른 접근법을 시도하십시오!

  • NestedClass 인터페이스 NestedInterface 확인하고 익명 클래스는이 인터페이스를 구현하는대로 다른 구현을 저장 :

    public static final NestedInterface firstNested = new NestedInterface() { 
        @Override 
        public void method() { 
         // ... 
        } 
    }; 
    
  • NestedClass 열거 NestedEnum을 확인하고에서 추상 메소드를 구현하는 열거 형 값로 다른 구현을 저장을 열거. 이것은 당신이 선택할 수있는 구현이 고정되어 있으며 외부 소스로부터 NestedClass 구현을 받아들이지 않으려는 경우에만 작동합니다.

    public enum NestedEnum { 
    
        FIRST { 
         @Override 
         public void method() { 
          // ... 
         } 
        }; 
    
        public abstract void method(); 
    } 
    

편집 : 귀하의 코멘트에 응답에서 :

The classes itself are static as well..

static 중첩 클래스의 맥락에서이 클래스를 포함하는 클래스의 인스턴스없이 을 인스턴스화 할 수 있다는 것을 의미한다.

첫 번째 예제와 같이 일반 중첩 클래스는 TopClass.this.new NestedClass1()을 통해 인스턴스화 할 수 있습니다. 일반적으로 생성자 또는 TopClass의 인스턴스 메서드 내에서 new NestedClass1()을 쓸 수 있지만이 자세한 형식에서는 TopClass.this에 대한 의존도를 명확하게 볼 수 있습니다. TopClass.this이 포함 된 클래스에 액세스 할 수 있으므로이 방법은 NestedClass1의 모든 방법에서도 볼 수 있습니다.

두 번째 예제와 같이 정적 중첩 클래스는 new TopClass.NestedClass1()을 통해 인스턴스화 할 수 있습니다. 다시 말하지만 new NestedClass1()이라고 쓸 수는 있지만 자세한 양식은 구성이 TopClass에만 의존하고 TopClass의 인스턴스와 관련이 없음을 명확하게 보여줍니다. TopClass 인스턴스를 만들지 않고 동일한 스 니펫 new TopClass.NestedClass1()을 사용하여 외부 클래스에서 인스턴스를 만들 수도 있습니다.

this question on inner classes and static nested classes을 살펴 보시기 바랍니다.

6

인터페이스와 통계가 일치하지 않습니다. 조금도. 정적 메소드에 패턴을 생성/부과하는 Java 지원은 없습니다.

1

인터페이스/추상 클래스가 중첩되어 있다는 사실은이 문제와 관련이 없습니다.
당신은 할 수 없습니다. Java에서 정적 메서드를 구현하기위한 몇 가지 클래스를 적용 할 수있는 방법은 없습니다. 그냥 울고 항복하고 인스턴스 메서드를 사용하십시오.

1

static abstract은 모순입니다. 정적 메서드는 다른 언어의 클래스 메서드와 다릅니다. 정적 메서드를 만들면 하나의 클래스로 이동하지만 상속 받지도 않고 구현이 하위 클래스로 연기되지도 않습니다.

왜 이러한 방법을 정적으로하는지 설명하지 마십시오. 이러한 메소드가 서브 클래스에 의해 정의되도록 (듯이)하고 싶지는 않습니다.

+0

정적은 메서드의 실행이 가지고있는 클래스의 인스턴스와 독립적이라는 것을 의미합니다. 클래스는 메서드를 나타 내기 때문에이 경우입니다. 클래스 자체도 정적입니다. –

관련 문제