powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
4 сообщений из 4, страница 1 из 1
Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
    #38123847
Gubtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!



Задача такая: есть коллекция с элементами типа Subclass (класса-потомка), есть метод, которому в качестве параметра нужно передать либо массив либо коллекцию, но обязательно типа Superclass (класса-родителя).

Если использовать массив типа класса-потомка, я могу его передавать как массив типа класса-родителя. Пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class Superclass{}

class Subclass extends Superclass{}

public class Test {
	
	public static void main(String[] args){
		Subclass[] sublasses = new Subclass[0];//создаем массив типа Subclass
		setSuperclasses(sublasses);//передаем массив типа Subclass как массив типа Superclass
	}
	
	public static void setSuperclasses(Superclass[] superclasses){}
	
}


Проблема в том, что использование массива мне не подходит. Но если вместо массива использовать коллекции, такой вариант уже не работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class Superclass{}

class Subclass extends Superclass{}

class Test {
	
	public static void main(String[] args){
		ArrayList<Subclass> sublasses = new ArrayList<Subclass>();//создаем ArrayList типа Subclass
		setSuperclasses(sublasses);// ОШИБКА: невозможно передать массив типа Subclass как массив типа Superclass
	}
	
	public static void setSuperclasses(ArrayList<Superclass> superclasses){}
	
}


Пока что нашел три варианта обхода:

1) Либо ArrayList переводить в массив такого же типа методом toArray:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class Superclass{}

class Subclass extends Superclass{}

public class Test {
	
	public static void main(String[] args){
		ArrayList<Subclass> sublasses = new ArrayList<Subclass>();//создаем ArrayList типа Subclass
		Subclass[] subclasses2 = new Subclass[sublasses.size()];
		subclasses2 = sublasses.toArray(subclasses2);//переводим ArrayList типа Subclass в массив типа Subclass
		setSuperclasses(subclasses2);//передаем массив типа Subclass как массив типа Superclass
	}
	
	public static void setSuperclasses(Superclass[] superclasses){}

}



2) Либо ArrayList переводить в массив методом toArray, но уже в тип класса-родителя:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class Superclass{}

class Subclass extends Superclass{}

public class Test {
	
	public static void main(String[] args){
		ArrayList<Subclass> sublasses = new ArrayList<Subclass>();//создаем ArrayList типа Subclass
		Superclass[] superclasses = new Superclass[sublasses.size()];
		superclasses = sublasses.toArray(superclasses);//переводим ArrayList типа Subclass в массив, но уже типа типа Superclass
		setSuperclasses(superclasses);
	}
	
	public static void setSuperclasses(Superclass[] superclasses){}

}



3) Либо создавать новый ArrayList с типом класса-потомка, и в конструкторе передавать старый ArrayList с типом класса-родителя:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Superclass{}

class Subclass extends Superclass{}

public class Test {
	
	public static void main(String[] args){
		ArrayList<Subclass> sublasses = new ArrayList<Subclass>();//создаем ArrayList типа Subclass
		ArrayList<Superclass> superclasses = new ArrayList<Superclass>(sublasses);//создаем новый ArrayList типа Superclass из старого ArrayList типа Subclass
		setSuperclasses(superclasses);
	}
	
	public static void setSuperclasses(ArrayList<Superclass> superclasses){}

}



Собственно, вопрос:
а) Какой из трех вариантов предпочтительнее?
б) Есть ли другие, более удачные варианты реализации передачи в метод массива или коллекции с элементами типа Superclass (класса-родителя), если есть коллекция с элементами типа Subclass (класса-потомка).

Заранее благодарю за помощь!
...
Рейтинг: 0 / 0
Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
    #38123850
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо так
Код: java
1.
setSuperclasses(ArrayList<? extends Superclass> superclasses){}

тогда, правда на массив накладываются некоторые ограничения по добавлению
либо так
Код: java
1.
<T extends Superclass>setSuperclasses(ArrayList<T> superclasses){}
...
Рейтинг: 0 / 0
Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
    #38124081
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дженерики не ковариантны, поэтому и не работает.
Иначе говоря, если Child extends Parent, то List<Child> вовсе не является потомком List<Parent>.
...
Рейтинг: 0 / 0
Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
    #38129991
Gubtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет, код переработал с использованием конструкции <? extends Superclass>.
Тема закрыта.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача коллекции как коллекции с элементами класса-родителя (суперкласса)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]