在Java接口中从默认方法调用方法

3
这可能是个愚蠢的问题,但我想知道是否有可能做到这一点。
假设我有如下接口:
public interface GroupIdentifier {

    Integer getRevision();
}

我需要另一个名为getNextRevision的方法。所以我可以在同一接口中实现默认方法并返回下一个数字。

例如:

public interface GroupIdentifier {

    //OUTER GET REVISION
    Integer getRevision();

    default GroupIdentifier getNextRevisionIdentifier() {
         return new GroupIdentifier() {
         //INNER GET REVISION
         public Integer getRevision() {
               //Here I want to return OUTER GET REVISION + 1
               return null;
         }
         };
    }
}

有没有可能性。


当然不行,因为您需要一个外部getRevision的实现。如果您传递一个外部接口实现的实例,则可以在该实例上调用getRevision()并使用它。 - Stultuske
只需直接为 getRevision 定义一个默认实现,不能在方法中实现另一个方法。INNER 用于类实现,而不是方法。编辑:在什么情况下应该返回 getRevision() + 1 - AxelH
我会使用抽象类来代替接口,因为在Java 8之后,你可以在接口中使用静态类。 - Nyranith
4个回答

6
我不确定 getNextRevisionIdentifier() 返回一个 GroupIdentifier 实例的目的是什么。
如果你想让 getNextRevisionIdentifier() 返回下一个标识符,让它返回一个 Integer
public interface GroupIdentifier {

    Integer getRevision();

    default Integer getNextRevisionIdentifier() {
        return getRevision () + 1;
    }

}

2

返回一个新的GroupIdentifier实例,你需要相应地实现getRevision方法:

public interface GroupIdentifier {

    //OUTER GET REVISION
    Integer getRevision();

    default GroupIdentifier getNextRevisionIdentifier() {
        //INNER GET REVISION
        Integer outer = getRevision();
        return new GroupIdentifier() {
            @Override
            public Integer getRevision() {
                return outer + 1;
            }
        }; // can be simplified to return () -> outer + 1;
    }
}

这可以通过以下方式运行,例如:

public static void main(String[] args) {
    GroupIdentifier groupIdentifier = new GroupIdentifier() {
        @Override
        public Integer getRevision() {
            return 1;
        }
    };
    System.out.println(groupIdentifier.getNextRevisionIdentifier().getRevision());
}

输出

2


2

我相信你想要写的是这样的:

public interface GroupIdentifier {
    Integer getRevision();

    default GroupIdentifier getNextRevisionIdentifier() {
        return new GroupIdentifier() {
            public Integer getRevision() {
                return GroupIdentifier.this.getRevision() + 1;
            }
        };
    }
}

你只是没有找到引用封闭实例的getRevision()方法的方式。顺便说一句,如果你的接口像你发布的那样,只有一个抽象方法,那么可以更加清晰地实现它:

public interface GroupIdentifier {
    Integer getRevision();

    default GroupIdentifier getNextRevisionIdentifier() {
        return () -> getRevision() + 1;
    }
}

非常感谢您的解决方案。您能否向我解释一下当我们使用GroupIdentifier.this.getRevision()时它是如何引用外部getRevision方法的?我需要了解它的工作原理和背后的概念。谢谢。 - Chamly Idunil
这是Java语法,用于引用封闭实例。它被称为“限定的this”。请注意,您的匿名类的类型不是GroupIdentifier,而是类似于GroupIdentifier$1的东西。GroupIdentifier.this指的是其封闭实例,其类型为GroupIdentifier - Marko Topolnik

1
我已经按照以下方式修复了我的解决方案。
public interface GroupIdentifier {
    Integer getRevision();

    default GroupIdentifier getNextRevisionIdentifier(GroupIdentifier identifier) {
        return new GroupIdentifier() {
            @Override
            public Integer getRevision() {
                return identifier.getRevision() + 1;
            }
        };
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接