【发布时间】:2013-02-02 01:57:41
【问题描述】:
在下面的示例中,为什么编译器能够推断出Foo.test() 中对Foo.create() 的第一次调用的通用参数,但在第二次调用中却不能这样做?我正在使用 Java 6。
public class Nonsense {
public static class Bar {
private static void func(Foo<String> arg) { }
}
public static class Foo<T> {
public static <T> Foo<T> create() {
return new Foo<T>();
}
private static void test() {
Foo<String> foo2 = Foo.create(); // compiles
Bar.func(Foo.create()); // won't compile
Bar.func(Foo.<String>create()); // fixes the prev line
}
}
}
(编译错误是类型Nonsense.Bar中的方法func(Nonsense.Foo)不适用于参数(Nonsense.Foo))。
注意:我知道编译器错误可以通过 test() 中的第三行来修复 - 我很好奇是否存在阻止编译器推断类型的特定限制。 在我看来这里有足够的上下文。
【问题讨论】:
-
我不知道你期待什么答案,除了“它不够聪明。”
-
@Louis - 可以想象,不够聪明是不可能的,但我还没弄清楚为什么。
-
@bacar:可能足够聪明,但事实并非如此。
标签: java generics type-inference