谷歌收益,从stackoverflow跳过帖子后, 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<>(){...}
遗憾的是,这些常见/简单的情况也被不必要地禁止了。