谷歌收益率,在跳过堆栈溢出的帖子后,http://mail.openjdk.java.net/pipermail/coin-dev/2011-June/003283.html
我猜是这样的,通常匿名类是表观类型的具体子类。
interface Foo<N extends Number>
{
void foo(N n);
}
Foo<Integer> foo = new Foo<Integer>(){ ... }
由实现
class AnonFoo_1 implements Foo<Integer>{ ... }
Foo<Integer> foo = new AnonFoo_1();
假设我们允许在匿名类上进行钻石推断,可能会有复杂的情况,例如
Foo<? extends Runnable> foo = new Foo<>(){ ... }
推理规则产生 ;按照上一个实现技巧,我们需要N=Number&Runnable
class AnonFoo_2 implements Foo<Number&Runnable>{ ... }
这是目前不允许的。类型 arg 到超类型必须是“普通”类型。Foo
但是,理由不是很充分。我们可以发明其他实现技巧来使其工作
class AnonFoo<N extends Number&Runnable> implements Foo<N>
{
@Override public void foo(N n)
{
n.intValue();
n.run();
}
}
Foo<? extends Runnable> foo = new AnonFoo<>();
编译器应该能够做同样的技巧。
无论如何,至少编译器应该允许大多数不涉及“不值得注意的类型”的用例,就像很遗憾,这些常见/简单的情况也被不必要地禁止了。Foo<Integer> foo = new Foo<>(){...}