返回具有自己类型的对象的 Java 接口

ale*_*lex 1 java concreteclass static-factory

我正在查看 Java 中内置的一个接口,并注意到它有返回其自己类型的对象的方法。

具体来说,IntStreamrange接口有一个返回 IntStream 对象(即实现 IntStream 的某个对象)的方法。该方法只需导入接口即可使用,如下:

import java.util.stream.IntStream;

class Foo {
    public static void main(String[] args) {
        IntStream s = IntStream.range(0,10);
        System.out.println(s.average());
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,似乎“在幕后”界面正在为我选择一个实现,并允许我使用它。这究竟是如何运作的?

至关重要的是,我将如何做同样的事情?如果我想导出一个可以实例化其自己类型的对象的接口,以便用户可以简单地导入我的接口并拖动我的实现,我该怎么做?或者这只是Java内置接口的特殊特权?

dav*_*tto 6

range是接口的静态方法IntStream,返回实现 的类的实例IntStream。看看下面的例子。

public interface MyInterface {

    public static class MyClass implements MyInterface {
        @Override 
        public void doSomething() {
            System.out.println( "i'm an implementing class!" );
        }
    }

    public static MyInterface createMagicInstance() {
        return new MyClass();
    }

    public void doSomething();

}

public class Test {
    public static void main( String[] args ) {
        MyInterface mi = MyInterface.createMagicInstance();
        mi.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的示例中,我尝试设计一些独立的东西,但实现createMagicInstance可能会有所不同。您不需要将返回类型实现为静态内部类。我建议您查看IntStreamOpenJDK类的源代码:https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/stream/IntStream .java