返回类型中推断的通配符泛型
2022-09-03 15:17:50
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?”似乎以某种方式暗示通配符是由编译器动态填充的,使类型为a,因此转换失败(从到)。这是对的吗?有没有办法解决这个问题?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);
}
}