LINUX.ORG.RU

Объясните пожалуйста, в чем проблема.

 


1

2

Ребята! Почему это в жабе не является корректным?

interface IMethod
{
	public void method();
}
class SomeClass implements IMethod
{
	public void method()
	{
		System.out.println(«hi»);
	}
}
class Application
{
	static private void execMethod(List<IMethod> list)
	{
		for(IMethod e: list)
		{
			e.method();
		}
	}
	static public void main(String[] args)
	{
		List<SomeClass> list = new ArrayList<SomeClass>();
  		execMethod(list); //вот тут говорит, что типы не подходят.
	}
}


Потому что List<SomeClass> не является наследником List<IMethod>

vurdalak ★★★★★ ()

Можно сделать

execMethod(List<? extends IMethod> list)

f1xmAn ★★★★★ ()

Потому что List<SomeClass> и List<IMethod> это разные классы.

Варианты:

1. Пиши List<IMethod> list = new ArrayList<IMethod>();

2. Совет выше.

3. Пиши execMethod((List) list);

4. Выкинь Java и пиши на Scala, там есть ковариантность в генериках.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 2)

Смотри, ты бы мог добавить в SomeClass ещё один метод, но SomeClass по прежнему реализовывает IMethod. В результате если бы ты его передал и дёрнул метод - получилась бы неопределённость. Наверное

// мимо первый-раз-вижу-яву

Debasher ★★★★★ ()

IDE под рукой нету, попробуй

static private void execMethod(List<? extends IMethod> list)
vertexua ★★★★☆ ()

Потому что execMethod потенциально мог бы вставить в список новый объект, который является IMethod, но не является SomeClass. После этого тот, кто пользуется списком дальше словил бы ClassCastException из-за того что встретил что-то неожиданное.

maxcom ★★★★★ ()
Ответ на: комментарий от mau5

List<SomeClass> не является подтипом List<IMethod>. Потому что это не имеет смысла в общем случае и приведёт к ошибкам:

List<SomeClass> l1 = new ArrayList<SomeClass>();
List<IMethod> l2 = l1; // предположим это скомпилируется, как ты хочешь
l2.add(new AnotherClass()); // AnotherClass implements IMethod, ошибки быть не может
SomeClass sc = l1.get(0); // WTF?
Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Кстати с массивами это вполне реальная проблема — с ними подобный код скомпилится и завалился в runtime

maxcom ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.