使用局部类型推断的交叉点类型的有用应用

Jac*_* G. 8 java type-inference

正如本博客所述,我们现在可以使用本地类型推断编写以下内容(据我所知,这是以前在不引入更多代码的情况下无法实现的):

public static void main(String... args) {
    var duck = (Quacks & Waddles) Mixin::create;
    duck.quack();
    duck.waddle();
}

interface Quacks extends Mixin {
    default void quack() {
        System.out.println("Quack");
    }
}

interface Waddles extends Mixin {
    default void waddle() {
        System.out.println("Waddle");
    }
}

interface Mixin {
    void __noop__();
    static void create() {}
}
Run Code Online (Sandbox Code Playgroud)

这个问题可能过于宽泛或主要基于意见,但在利用这样的交集类型时是否存在任何有用的应用?

Hol*_*ger 7

从Java 5开始,处理部分未知的类型是可能的,因此很容易将您的示例反向移植到Java 8:

public static void main(String... args) {
    use((Quacks & Waddles)Mixin::create);
}
private static <Duck extends Quacks & Waddles> void use(Duck duck) {
    duck.quack();
    duck.waddle();
}
interface Quacks extends Mixin {
    default void quack() {
        System.out.println("Quack");
    }
}
interface Waddles extends Mixin {
    default void waddle() {
        System.out.println("Waddle");
    }
}
interface Mixin {
    void __noop__();
    static void create() {}
}
Run Code Online (Sandbox Code Playgroud)

因此,var在Java 10中进行相同操作的可能性允许与以前一样,但源代码略少.并且能够做与以前相同的事情但是使用更少的样板代码正是var关于什么,无论你是否使用交集类型.


Eug*_*ene 4

你也可以在 java-8 中这样做:

static class ICanDoBoth implements Quacks, Waddles {
    // implement void __noop__(); here...
}

public static void both(Object b) {
    // my point here is that you can't declare such a type 'x'
    Optional.of((Quacks & Waddles) b)
            .ifPresent(x -> {
                x.quack();
                x.waddle();
            });
}
Run Code Online (Sandbox Code Playgroud)

并通过以下方式调用它:both(new ICanDoBoth());

问题是您不能声明交集类型的变量(好吧,除非var或 由编译器使用 推断出的变量Optional.of())。

实际上这里有一些提示,但我从未在非常有用的东西中使用过交集类型的变量......

  • 您不需要 Java 8 中的“ICanDoBoth”接口,您可以按照与问题中相同的方式使用具有交集类型的方法引用。与问题中的操作相同只需要另外两行代码...... (2认同)