相关疑难解决方法(0)

返回类型的推断通配符泛型

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)

java generics bounded-wildcard

16
推荐指数
1
解决办法
2378
查看次数

标签 统计

bounded-wildcard ×1

generics ×1

java ×1