【发布时间】:2009-08-18 14:24:47
【问题描述】:
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);
}
非常好。但是,这不再适用于以下需要通配符的用例:
Pair<Class<?>, String> pair = Pair.of((Class<?>) List.class, "hello");
(注意显式转换以使 List.class 成为正确的类型。)
代码失败并出现以下错误(由 Eclipse 提供):
类型不匹配:无法从
TestClass.Pair<Class<capture#1-of ?>,String>转换为TestClass.Pair<Class<?>,String>
但是,显式调用构造函数仍然可以按预期工作:
Pair<Class<?>, String> pair =
new Pair<Class<?>, String>((Class<?>) List.class, "hello");
有人可以解释这种行为吗?是设计使然吗? 需要吗?我是做错了什么,还是偶然发现了编译器中的设计缺陷/错误?
大胆猜测:“capture#1-of ?”不知何故似乎暗示通配符是由编译器动态填充的,使类型为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);
}
}
【问题讨论】:
-
看起来转换器在返回 Pair 时看到了“of”的签名,?扩展类
> 类型。对于最终类,它似乎足够聪明,可以减少扩展部分,这就是它不会抱怨字符串的原因。 -
嗯,很有趣。感谢您在此处链接我。
-
它现在可以在 java8 中使用。推理的目标类型也被咨询。
标签: java generics bounded-wildcard