Unten ist der Code, den ich ausführen möchte:
%Vor% Die Methode printStudentDetails
from MyGenericClassforLowerBound
erzeugt das Problem. Die Anweisungen student.printDetails
und student.printSomeOtherDetails
sagen mir
Soweit ich verstanden habe:
Q[A <: B]
bedeutet, dass die Klasse / Methode Q
beliebige Objekte der Klasse A
übernehmen kann, wobei die Klasse A
der Untertyp der Klasse B
ist. Dies wird Upper Bound genannt. Q[A >: B]
bedeutet, dass die Klasse / Methode Q
beliebige Objekte der Klasse A
übernehmen kann, wobei die Klasse A
der Super-Typ der Klasse B
ist. Dies wird Lower Bound genannt. Bitte helfen Sie mir, wenn mein Verständnis falsch ist, und helfen Sie mir zu verstehen, warum das oben genannte Problem auftritt. Danke Jungs.
Ihr Verständnis ist nicht falsch, aber Sie haben die Konsequenzen nicht verfolgt.
Insbesondere haben alle Parameter tatsächlich eine Obergrenze von Object
, wenn keine explizite Obergrenze angegeben ist. Dies geschieht bei der Methode printStudentDetails
in Ihrem Typ MyGenericClassforLowerBound
. Das heißt, ein Wert vom Typ Object
könnte als Parameter für diese Methode übergeben werden. Aber Typ Object
definiert nicht die Methoden printDetails
und printSomeOtherDetails
- daher der Fehler.
Um die Methode kompilieren zu lassen, müssten Sie auch eine geeignete obere Grenze angeben (ähnlich wie MyGenericClassforUpperBound
), zB:
Es sollte in diesem Fall jedoch beachtet werden, dass die untere Grenze effektiv redundant wird, weil jeder Parameter, der die Unterklassen Student
erfolgreich übergeben kann, da er vom Typ Student
behandelt werden kann und die obere Grenze erfüllt - so können auch InformationTechnologyStudent
und Unterklassen von ComputerScienceStudent
erfolgreich übergeben werden. Diese Art von Konstrukt ist nützlicher, wenn Sie Werte übergeben, die Typen aus zwei verschiedenen Hierarchien mischen.