通配符的超类型限定

2019-03-16  本文已影响0人  hswwjp

带有超类型限定的通配符可以向泛型对象写入, 带有子类型限定的通配符可以从泛型对象读取.

Pari<? extends Employee>
? extends Employee getFirst()
void setFirst(? extends Employee)

编译器只知道需要某个 Employee 的子类型, 但不知道具体是什么类型, 它拒绝传递任何特定的类型. 毕竟 ? 不能用来匹配.


Pair<? super Manager>
void setFirst(? super Manager)
? super Manager getFirst()

编译器不知道setFirst 方法的确切类型, 但是可以用任意 Manager 对象(或子类型, 例如, Executive) 调用它, 而不能用 Employee 对象调用. 然而, 如果调用 getFirst, 返回的对象类型就不会得到保证. 只能把它赋给一个 Object.


    public static void main(String[] args) {
        GregorianCalendar[] gc = new GregorianCalendar[2];
        GregorianCalendar gregorianCalendar = testSuperType(gc);
    }

    // GregorianCalendar extends Calendar, Calendar implements Comparable<Calendar>, so GregorianCalendar implements Comparable<Calendar> actually,
    // is not extends Comparable<GregorianCalendar>
    // public static <T extends Comparable<T>> T testSuperType(T[] gc) { // ERROR if T[] instanceof GregorianCalendar[]
    @Test
    public static <T extends Comparable<? super T>> T testSuperType(T[] gc) {
        return null;
    }

GregorianCalendar 是 Calendar的子类, 并且 Calendar实现了 Comparable<Calendar>. 因此 GregorianCalendar实现的是 Comparable<Calendar>, 而不是 Comparable<GregorianCalendar>.

上一篇下一篇

猜你喜欢

热点阅读