Проблема в экзамене сегодня утром - методы ArrayList - PullRequest
1 голос
/ 12 марта 2012

Сегодня у меня был экзамен по курсу "Java для Android I", и я нашел этот вопрос, который мне просто не дано. Может быть, некоторые из вас могли бы объяснить это для меня.

Вопрос:

Посмотреть эту коллекцию ArrayList p . Класс Человек - это суперкласс для ученика. ArrayList реализует интерфейс List (согласно Java-API).

Компилятор не разрешает некоторые ситуации, отмеченные в коде. Зачем? Опишите, как они могут повлечь, что p не будет содержать экземпляры Person или почему p не является ArrayList . Например. p.add ("Hello"); сейчас содержит экземпляр String.

Код:

p = new ArrayList<Object>();

void method ( ArrayList<Student> als) { ... }

void method ( List<Person> lp ) { ... }

void method ( ArrayList<Object> alo) { ... }

Как бы вы описали этот вопрос? Я просто не понимаю, чего хочет мой профессор, от меня ответа.

Извините, если цитата испортила грамматику. Я переводил это со шведского.

Ответы [ 4 ]

4 голосов
/ 12 марта 2012

Вопрос вашего профессора об основах проверки типов в дженериках 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 объектов..

Вызовы методов работают точно так же.Просто удалите тип аргумента из сигнатуры метода и попытайтесь представить присвоение этому типу ...

1 голос
/ 12 марта 2012

Трудно сказать наверняка по тому, что вы предоставили, но кажется, что профессор, скорее всего, пытается проверить ваше понимание некоторых тонкостей с помощью дженериков.

Тот факт, что он не показывает объявление ссылки p, является подсказкой.

Это допустимо, если передана ссылка p:

method (ArrayList <\ Object> alo) // потому что тип и параметр соответствует ровно

Это незаконно:

method(ArrayList<Student> als) //because the method will expect Student and will get Object
method(List<Person>) //same reason.. expects list of Person, and will get Objects
0 голосов
/ 12 марта 2012

Или это может быть о следующем - я не знаю точно:)

// take some method
void method ( ArrayList<Object> ) { /* ... */ }

// and an Object
ArrayList<Object> p = new ArrayList<Object>();

Теперь вы можете сказать method(p), и это будет работать, потому что метод ожидает ArrayList<Object>.Но

ArrayList<Student> q = new ArrayList<Student>();
method ( q );

не будет работать.Потому что ArrayList<Student> не является ArrayList<Object>, хотя Studend extends Object.Для этого вам необходимо определить метод:

void method ( ArrayList<? extends Object> ) { /* ... */ }
// or shorter but the same
void method ( ArrayList<?> ) { /* ... */ }

Если вам нужен метод, который может принимать как ArrayList<Person>, так и ArrayList<Student> (и все другие подклассы Person), вы должны объявить его

void method ( ArrayList<? extends Person>) { /* ... */ }
0 голосов
/ 12 марта 2012

Не совсем понял ваш вопрос, хотя

Первый и третий методы являются дублирующими методами в соответствии с правилом Java overLoading.Компилятор скажет, что они являются дублирующими методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...