Вопрос вашего профессора об основах проверки типов в дженериках Java.Предполагая:
class Person {
}
class Student extends Person {
}
Это допустимый фрагмент:
List<Person> list = new ArrayList<Person>();
, как это:
List<Object> list = new ArrayList<Object>();
Это явно недопустимо, потому что объект может бытьPerson
экземпляр, не являющийся Student
экземпляром:
List<Student> list = new ArrayList<Person>();
Но этот мой любимый - он всегда сбивает людей с толку:
List<Person> list = new ArrayList<Student>();
Этотневерный фрагмент"Что почему!"Я слышал, вы спрашиваете.Что ж, это правда, что все Student
объекты также являются экземплярами Person
, поэтому такие назначения выполняются следующим образом:
Person person = new Student();
Когда дело доходит до параметрических типов, компилятор Java делает все возможное длязащищать тебя.Представьте себе этот фрагмент кода:
List<Person> list = new ArrayList<Student>();
list.add(new Person());
Если бы компилятор не возражал против назначения, теперь можно было бы вводить Person
объекты в ArrayList
, который содержит только Student
объектов..
Вызовы методов работают точно так же.Просто удалите тип аргумента из сигнатуры метода и попытайтесь представить присвоение этому типу ...