美文网首页
通配符的超类型限定

通配符的超类型限定

作者: hswwjp | 来源:发表于2019-03-16 23:52 被阅读0次

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

    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>.

    相关文章

      网友评论

          本文标题:通配符的超类型限定

          本文链接:https://www.haomeiwen.com/subject/benemqtx.html