Java通常可以根据参数推断泛型(甚至在返回类型上,与例如C#相反).
例证:我有一个Pair<T1, T2>只存储一对值的泛型类,可以按以下方式使用:
Pair<String, String> pair = Pair.of("Hello", "World");
Run Code Online (Sandbox Code Playgroud)
该方法of看起来像这样:
public static <T1, T2> Pair<T1, T2> of(T1 first, T2 second) {
return new Pair<T1, T2>(first, second);
}
Run Code Online (Sandbox Code Playgroud)
非常好.但是,这不再适用于以下需要使用通配符的用例:
Pair<Class<?>, String> pair = Pair.of((Class<?>) List.class, "hello");
Run Code Online (Sandbox Code Playgroud)
(注意显式强制转换以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");
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种行为吗?它是按设计的吗?它需要吗?我做错了什么,或者我偶然发现编译器中的设计/错误存在缺陷?
狂野猜测:"捕获#1-of?"似乎暗示通配符由动态编译器填充,使类型为a Class<List>,从而使转换失败(从)Pair<Class<?>, String>到Pair<Class<List>, String>.这是正确的吗?有办法解决这个问题吗?
为了完整起见,这里是Pair该类的简化版本:
public final class Pair<T1, T2> {
public …Run Code Online (Sandbox Code Playgroud)