带有超类型限定的通配符可以向泛型对象写入, 带有子类型限定的通配符可以从泛型对象读取.
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>.
网友评论