Discuss / Java / 上面说这个 Integer x = p.getFirst(); 无法通过编译,为什么 Integer x = p2.getFirst(); 可以跑出结果?

上面说这个 Integer x = p.getFirst(); 无法通过编译,为什么 Integer x = p2.getFirst(); 可以跑出结果?

Topic source

跑的是:

public class Main {
public static void main(String[] args) {
        Pair<Number> p1 = new Pair<>(12.3, 4.56);
        Pair<Integer> p2 = new Pair<>(123, 456);
        setSame(p1, 100);
        setSame(p2, 200);
        Integer x = p2.getFirst(); //加了这个,然后run的出结果的
        System.out.println(x);
        System.out.println(p1.getFirst() + ", " + p1.getLast());
        System.out.println(p2.getFirst() + ", " + p2.getLast());
    }

    static void setSame(Pair<? super Integer> p, Integer n) {
        p.setFirst(n);
        p.setLast(n);
    }

}

class Pair<T> {
    private T first;
    private T last;

    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }

    public T getFirst() {
        return first;
    }
    public T getLast() {
        return last;
    }
    public void setFirst(T first) {
        this.first = first;
    }
    public void setLast(T last) {
        this.last = last;
    }
}

文中的意思是在那个有通配符?的静态方法里使用会报错,你在main方法里肯定能通过,因为main方法中p与p2是普通泛型类,它们的定义中没有用通配符?super T的形式


  • 1

Reply