Java通常可以基于参数(甚至在返回类型上,与例如C#相比)推断泛型。返回类型推断的通配符泛型
个例子:我有一个泛型类Pair<T1, T2>
这只是存储的一对值,可以通过以下方式使用:
Pair<String, String> pair = Pair.of("Hello", "World");
的方法of
看起来就像这样:
public static <T1, T2> Pair<T1, T2> of(T1 first, T2 second) {
return new Pair<T1, T2>(first, second);
}
非常好。但是,这已不再适用于以下用例,这需要通配符:(注意显式类型转换,使List.class
正确的类型)
Pair<Class<?>, String> pair = Pair.of((Class<?>) List.class, "hello");
代码失败,出现以下错误(提供通过Eclipse中):
类型不匹配:不能从
TestClass.Pair<Class<capture#1-of ?>,String>
转换为TestClass.Pair<Class<?>,String>
然而,显式调用构造函数仍然按预期工作:
Pair<Class<?>, String> pair =
new Pair<Class<?>, String>((Class<?>) List.class, "hello");
有人能解释这种现象?它是否由设计?是想要?我做错了什么,或者我偶然发现了编译器中的设计/错误?
胡乱猜测:“捕获#1-的?”不知何故似乎暗示通配符由上飞编译器填充,使得类型Class<List>
,因而失败的转换(从Pair<Class<?>, String>
至Pair<Class<List>, String>
) 。这是正确的吗?有没有办法解决这个问题?
为了完整起见,这里是Pair
类的简化版本:
public final class Pair<T1, T2> {
public final T1 first;
public final T2 second;
public Pair(T1 first, T2 second) {
this.first = first;
this.second = second;
}
public static <T1, T2> Pair<T1, T2> of(T1 first, T2 second) {
return new Pair<T1, T2>(first, second);
}
}
看起来转换器看到“of”的签名,因为它返回一个Pair <?扩展类,?扩展类>类型。 对于最终的类,它似乎足够聪明,减少了扩展部分,这就是为什么它不会在字符串上投诉。 –
Zed
2009-08-18 15:08:43
嗯,有趣。感谢您在此链接我。 – jjnguy 2011-06-13 19:14:30
它现在在java8中工作。目标类型也被咨询为inferene。 – ZhongYu 2015-08-06 17:25:21