Le code source est le suivant et passe à l'invite ci-dessous. Ce code ne peut évidemment pas être compilé
.Je pense qu'une des raisons est
BoundedEcho<String> stringEcho = new BoundedEcho<String>();
La String ici ne peut pas hériter de Number. Ce n'est pas une sous-classe de String. Est-ce correct ?
Ensuite, une autre question est la suivante : j'ai transmis un objet new BoundedEcho<Integer>
dans le dernier paragraphe, et il appartient à BoundedEcho<T>, pourquoi une erreur est-elle signalée ici ?
Est-ce que BoundedEcho
改为public class BoundedEcho<? extends Number> {...}
a raison ?
Le code source est ici
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>());
}
}
Le problème réside dans ces deux phrases
Lors de l'instanciation, vous déclarez T comme numéro et les appels suivants doivent être BoundedEcho<Number>. La raison en est que les types tels que BoundedEcho<Integer> et BoundedEcho<Number> sont des classes différentes et qu'il n'y a pas de relation d'héritage.