1

我对嵌套类有 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(){
        }
    }    
}

但麻烦就开始了。静态方法不能从非静态接口方法正确继承,因为我This static method cannot hide the instance method from TopClass.NestedClass在 Eclipse 中收到此消息。

当我将接口方法设为静态时,它给了我这个错误: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(){
        }
    }    
}

但同样,看似抽象的方法不能声明为 static: 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 fe 中,它们必须能够被上层结构“捕获”。我得到了尝试匿名类或枚举的提示,现在就试试。

4

4 回答 4

6

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

于 2012-05-14T20:32:17.510 回答
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(),但详细的形式清楚地表明该构造仅依赖于. 您甚至可以使用相同的代码片段从外部类创建实例,而无需创建实例。TopClassTopClassnew TopClass.NestedClass1()TopClass

我建议你看看这个关于内部类和静态嵌套类的问题。

于 2012-05-14T20:59:42.813 回答
1

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

于 2012-05-14T20:37:13.623 回答
1

static abstract是矛盾的。静态方法与其他语言的类方法不同。当您创建一个静态方法时,它会在单个类上运行,它不会被继承或将其实现推迟到子类。

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

于 2012-05-14T20:37:30.020 回答