如何使用静态方法定义嵌套静态类,从Java中的嵌套接口继承?

时间:2012-05-14 20:30:16

标签: java interface static nested abstract

我遇到嵌套类的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缺乏存储方法引用的可能性。所以我只使用一种方法将这些类放在每个类中,而是将它们存储在List f.e中。他们必须能够被上层建筑“抓住”。 我得到了尝试匿名课程或枚举的提示,现在就试试吧。

4 个答案:

答案 0 :(得分:6)

接口和静态不会在一起。完全没有。在静态方法上创建/强加模式没有Java支持。

答案 1 :(得分: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();
    }
    

编辑:回复您的评论:

  

这些类本身也是静态的。

嵌套类上下文中的

static意味着可以在没有包含类的实例的情况下实例化

可以通过TopClass.this.new NestedClass1()实例化第一个示例中的常规嵌套类。通常,您只需在构造函数或new NestedClass1()的实例方法中编写TopClass,但在此详细形式中,您可以清楚地看到对TopClass.this的依赖。这也可以从NestedClass1的任何方法中看出,因为您可以访问包含TopClass.this的类。

可以通过new TopClass.NestedClass1()实例化第二个示例中的静态嵌套类。再一次,你可以写new NestedClass1(),但是详细的表格清楚地表明构造仅依赖于TopClass并且与TopClass的实例无关。您甚至可以使用相同的代码段new TopClass.NestedClass1()从外部类创建实例,而无需创建TopClass实例。

我建议你看一下this question on inner classes and static nested classes

答案 2 :(得分:1)

您的接口/抽象类嵌套的事实与问题无关 你不能。 Java中没有办法强制实现某些类来实现静态方法。只是哭泣并投降并使用实例方法。

答案 3 :(得分:1)

static abstract是一个矛盾。静态方法与其他语言的类方法不同。当你创建一个静态方法时,它会进入一个类,它不会被继承,或者它的实现被推迟到子类。

您没有解释为什么您希望这些方法是静态的。如果您希望这些方法由子类定义,那么它们不应该是。