Java 在接口的静态方法中调用默认方法

Java 在接口的静态方法中调用默认方法,java,java-8,Java,Java 8,我需要在接口的静态方法中调用一个默认方法(同一接口中有两个方法,一个是默认的,另一个是静态的)。这可能吗?如果是,我怎样才能做到这一点 查看代码部分以更好地理解我的问题: interface A{ default void callee(){ //do something here } static void caller(){ //call callee() method anyhow } } 您需要实例来调用非静态方法 static

我需要在接口的静态方法中调用一个默认方法(同一接口中有两个方法,一个是默认的,另一个是静态的)。这可能吗?如果是,我怎样才能做到这一点

查看代码部分以更好地理解我的问题:

interface A{
default void callee(){
        //do something here
    }

    static void caller(){
        //call callee() method anyhow
    }
}

您需要实例来调用非静态方法

static void caller() {
    new A(){}.callee();
}

最好避免静态到非静态调用。我想您可以将被调用方的一部分提取到静态方法。

您需要实例来调用非静态方法

static void caller() {
    new A(){}.callee();
}

最好避免静态到非静态调用。我想您可以将被调用方的一部分提取到静态方法。

默认方法是由实现接口的所有类继承的“默认”方法。这避免了为实现接口的每个类重写方法。
static void caller() {
    new A(){}.callee();
}
只能使用实现“A”接口的类的对象实例从被调用方“A”调用默认方法

您有两种选择:

  • 将A对象作为参数传递给静态“调用者”方法

    interface A {
        default void callee(){
            //do something here
        }
    
        static void caller(A anAInstance){
            anAInstance.callee();
        }
    }
    
  • 在此方法内创建一个匿名类

    interface A {
        default void callee(){
            //do something here
        }
    
        static void caller(){
            new A(){}.callee();
        }
    }
    

  • 有关默认方法的更多信息,请参见:

    默认方法是由实现接口的所有类继承的“默认”方法。这避免了为实现接口的每个类重写方法。 只能使用实现“A”接口的类的对象实例从被调用方“A”调用默认方法

    您有两种选择:

  • 将A对象作为参数传递给静态“调用者”方法

    interface A {
        default void callee(){
            //do something here
        }
    
        static void caller(A anAInstance){
            anAInstance.callee();
        }
    }
    
  • 在此方法内创建一个匿名类

    interface A {
        default void callee(){
            //do something here
        }
    
        static void caller(){
            new A(){}.callee();
        }
    }
    

  • 有关默认方法的更多信息,请参见:

    请显示您的代码,并说明您遇到的具体问题。当静态方法需要调用实例方法时,为什么静态方法需要是静态的。如果行为依赖于状态,那么它可能不应该是静态的。我只能想到
    静态void caller(A){A.callee();}
    ,但我怀疑这就是您要寻找的。就我个人而言,在这种情况下,我很可能会将其作为一种实例方法。由于是void返回类型,我假设它改变了某个实例的状态。所以你需要一个实例。我觉得这可能是个x-y问题。你想做什么?请展示你的代码并说明你有什么具体问题。为什么你的静态方法在需要调用实例方法时需要是静态的。如果行为依赖于状态,那么它可能不应该是静态的。我只能想到
    静态void caller(A){A.callee();}
    ,但我怀疑这就是您要寻找的。就我个人而言,在这种情况下,我很可能会将其作为一种实例方法。由于是void返回类型,我假设它改变了某个实例的状态。所以你需要一个实例。我觉得这可能是个x-y问题。你想做什么?谢谢@Sergey Rybalkin谢谢@Sergey Rybalkin