正如this blog所述,我们现在可以使用本地类型推断来编写以下内容(据我所知,在不引入更多代码的情况下,以前是不可能的):
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() {}
}
这个问题可能过于宽泛或主要基于意见,但在利用这样的交集类型时是否存在任何有用的应用?
答案 0 :(得分: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() {}
}
因此,使用Java 10中的var
进行相同操作的可能性允许与之前相同,但源代码略少。并且能够做与以前相同的事情,但使用更少的样板代码正是var
的关键,无论你是否使用交集类型。
答案 1 :(得分: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();
});
}
并通过以下方式致电:both(new ICanDoBoth());
你不能声明一个交集类型的变量(好吧,除非var
或编译器使用Optional.of()
推断出的变量)。
实际上有一些提示here,但我从来没有在非常有用的东西中使用过交叉类型的变量...