首页 > 解决方案 > 为什么在使用通配符参数化类型的泛型类型时必须添加显式转换?

问题描述

这是代码:

public class Pair<X,Y> {
    private X first;
    private Y second;
    public Pair(X x, Y y) {
            first = x;
            second = y;
    }
    public X getFirst() { return first; }
    public Y getSecond() { return second; }
    public void setFirst(X x) { first = x; }
    public void setSecond(Y y) { second = y; }
}

final class Test {
    public static void main(String[] args) {
        String a = "a";
        Pair<?,?> pair = new Pair<String,Long>("limit", 10000L);
        String s = pair.getFirst();
}

这段代码不行,因为方法返回的对象getFirst()不能转成字符串:</p>

Test.java:5: error: incompatible types: CAP#1 cannot be converted to String
                String s = pair.getFirst();
                                        ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
1 error

似乎编译器添加了隐式转换但失败了。

但是当我添加一个显式的 cast( String s = (String)pair.getFirst()) 时,它就起作用了。

为什么会这样???

标签: javatypescasting

解决方案


推荐阅读