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

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

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() {} } 

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

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

 public static void main(String... args) { use((Quacks & Waddles)Mixin::create); } private static  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() {} } 

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

你也可以在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(); }); } 

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

事情是你不能声明交集类型的变量(好吧,除非var或由编译Optional.of()推断的变量)。

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