这是旧考试的代码段。有人可以给我答案,然后告诉我原因。

import java.util.*;
abstract class A {
  abstract void tu();
}
class P extends A {
  char c = 'c';
  P(char c){ this.c = c; }
  P(){ new P('p'); }
  public void tu (){ System.out.printf("P.tu->%c\n", c); }
}
class K extends P {
 char c = 'c';
 K(char c){ this.c = c; }
 K(){ new K('k'); }
 public void tu (){ System.out.printf("K.tu->%c\n", c); }
}
 class E extends K {
 char c = 'c';
 E(char c){ this.c = c; }
 E(){ new E('e'); }
 public void tu (){ System.out.printf("E.tu->%c\n", c); }
}
class G extends E {
 char c = 'c';
 G(char c){ this.c = c; }
 G(){ new G('g'); }
 public void tu (){ System.out.printf("G.tu->%c\n", c); }
}

public class Question {

  static void magic( Queue< ? super … > q ){ ← which class is allowed and why?
   q.add( new E('?') );
  }

  public static void main( String[] args ){
    Queue<K> q = new LinkedList<K>();
    magic(q);
    while ( ! q.isEmpty() ) { q.poll().tu(); }
  }
}


我在BlueJ中复制了它,并像这样:

 static void magic( Queue<? super K > q );
  q.add(new E('?') );
 }


但是然后我得到一个标识符异常。
提前致谢!!!
汉斯

最佳答案

这是下界通配符:https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html

对于问题:which class is allowed and why?
答案:A,因为A是所有这些类的父级。我们可以将其用作所有参考。

09-26 11:37