suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Kompilierungsprobleme mit Java-Generika

Der Quellcode lautet wie folgt und springt zur Eingabeaufforderung unten. Dieser Code kann offensichtlich nicht kompiliert werden

Ich denke, ein Grund ist

 BoundedEcho<String> stringEcho = new BoundedEcho<String>();

Der String hier kann Number nicht erben. Es ist keine Unterklasse von String.

Dann ist noch eine Frage: Ich habe im letzten Absatz ein new BoundedEcho<Integer>-Objekt übergeben, das zu BoundedEcho<T> gehört. Warum wird hier ein Fehler gemeldet?

Ist BoundedEcho改为public class BoundedEcho<? extends Number> {...} richtig?

Der Quellcode ist hier

public class BoundedEcho<T extends Number> {

    public T echo(T value) {
        return value;
    }

    public BoundedEcho<T> echo(BoundedEcho<T> value) {
        return value;
    }
}
public class BoundedEchoChamber{
    public static void main(String[] args) {
        BoundedEcho<Number> numberEcho = new BoundedEcho<Number>();
        numberEcho.echo(10);
        numberEcho.echo(10d);
        numberEcho.echo(10f);
        numberEcho.echo(10L);
    
        BoundedEcho<String> stringEcho = new BoundedEcho<String>();
        
        numberEcho.echo(new BoundedEcho<Integer>());
        numberEcho.echo(new BoundedEcho<Double>());
        numberEcho.echo(new BoundedEcho<Float>());
        numberEcho.echo(new BoundedEcho<Long>());
    }
}
世界只因有你世界只因有你2751 Tage vor523

Antworte allen(1)Ich werde antworten

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-17 10:05:13

    问题出在这两句

    public BoundedEcho<T> echo(BoundedEcho<T> value) {
            return value;
        }
        
    BoundedEcho<Number> numberEcho = new BoundedEcho<Number>();

    实例化的时候你把T声明成了Number,之后调用就必须是BoundedEcho<Number>。原因是BoundedEcho<Integer>等类型和BoundedEcho<Number>是不同的类,并不存在继承关系。

    Antwort
    0
  • StornierenAntwort