Джавщики, не дайте впасть в безумие...

User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Уперся тут...
"...все извилины заплел и Канатчиковы власти..."

Да вдобавок все эккаунты в профильных тусовках утеряны.

Короче дано:

1. Базовый не мой интерфейс:

Code: Select all

package gnr;

public interface Papa3rdPartyIface {
}
2. Один из его детенышей (тоже не мой):

Code: Select all

package gnr;

public interface Kid3rdPartyIface extends Papa3rdPartyIface {
}
3. Еще один тырфейс (опять таки не мой):

Code: Select all

package gnr;

import java.util.List;

public interface Some3rdPartyIface {
	public List<? extends Papa3rdPartyIface> gimmeIt();
}
4. Теперь мой код:

Code: Select all

package gnr;

import java.util.List;

public class MyClz implements Kid3rdPartyIface {

	public static void main(String[] args) {
		Some3rdPartyIface someObj = null;

		// Skipped - here we obtain the object of the class that implements 'Some3rdPartyIface'... Doesn't matter how.

		List<? extends Papa3rdPartyIface> lst = someObj.gimmeIt();

		MyClz obj = new MyClz();

		// Now I want to add my obj on the top of the list but compiler yells 
		lst.add(0, obj);
	}
}
Теперь печалька: в классе Clz строка lst.add(0, obj); вызывает ошибку компиляции: "The method add(int, capture#2-of ? extends Papa3rdPartyIface) in the type List<capture#2-of ? extends Papa3rdPartyIface> is not applicable for the arguments (int, MyClz)"

Обратите внимание - "class MyClz implements Kid3rdPartyIface".
Если важно - Java 8.

Вопрос к залу - какого хрена? Я реально не могу понять отчего ругань.

Как пофиксить - брутал форсе работает как всегда на 5. Если я забью на дженерики в определении листа, то все скомпилится. Но мне интересно понять почему оно не, а понять не понимается :(

Пасиб всем неравнодушным.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
Ann4Ann
Уже с Приветом
Posts: 1239
Joined: 14 Nov 2002 23:02
Location: S.Peterburg, Russia -->SoFla

Re: Джавщики, не дайте впасть в безумие...

Post by Ann4Ann »

List<? extends Papa3rdPartyIface> lst означает в списке будут объекты какого-то одного класса, наследующего Papa3rdPartyIface, а не разнообразные объекты приводимые к этому интерфейсу.
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Ann4Ann wrote: 01 Mar 2018 05:42 List<? extends Papa3rdPartyIface> lst означает в списке будут объекты какого-то одного класса, наследующего Papa3rdPartyIface, а не разнообразные объекты приводимые к этому интерфейсу.
А я "? extends Papa3rdPartyIface" понимаю как "что угодно являющееся потомком Papa3rdPartyIface".
Если нужен лист с объектами какого-то одного класса, то так и пишут List<KakojtoKlass>.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Еще: текст ошибки выше это что я вижу в Эклипсе.

В коммандной строке выглядит чуть иначе:

Code: Select all

тихий@хост:~/.../src> javac -cp . -Xdiags:verbose gnr/MyClz.java 
gnr/MyClz.java:17: error: no suitable method found for add(int,MyClz)
                lst.add(0, obj);
                   ^
    method Collection.add(CAP#1) is not applicable
      (actual and formal argument lists differ in length)
    method List.add(CAP#1) is not applicable
      (actual and formal argument lists differ in length)
    method List.add(int,CAP#1) is not applicable
      (argument mismatch; MyClz cannot be converted to CAP#1)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Papa3rdPartyIface from capture of ? extends Papa3rdPartyIface
1 error
тихий@хост:~/.../src>
Появились какие-то загадочные слова "capture" и "fresh type-variable". Ухожу в гугл.

Если кому интересно потыркаться - вот эклипсный прож:
eclipse-prj.zip
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
Ann4Ann
Уже с Приветом
Posts: 1239
Joined: 14 Nov 2002 23:02
Location: S.Peterburg, Russia -->SoFla

Re: Джавщики, не дайте впасть в безумие...

Post by Ann4Ann »

Ion Tichy wrote: 01 Mar 2018 05:51
Ann4Ann wrote: 01 Mar 2018 05:42 List<? extends Papa3rdPartyIface> lst означает в списке будут объекты какого-то одного класса, наследующего Papa3rdPartyIface, а не разнообразные объекты приводимые к этому интерфейсу.
А я "? extends Papa3rdPartyIface" понимаю как "что угодно являющееся потомком Papa3rdPartyIface".
Если нужен лист с объектами какого-то одного класса, то так и пишут List<KakojtoKlass>.
List< Papa3rdPartyIface> будет как раз "что угодно являющееся потомком Papa3rdPartyIface"

A extends T
B extends T

List<? extends T> a = new List<A>()
List<? extends T> b = new List<B>()

you can not do a.add(B.getObj)
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Ann4Ann wrote: 01 Mar 2018 05:59
Ion Tichy wrote: 01 Mar 2018 05:51
Ann4Ann wrote: 01 Mar 2018 05:42 List<? extends Papa3rdPartyIface> lst означает в списке будут объекты какого-то одного класса, наследующего Papa3rdPartyIface, а не разнообразные объекты приводимые к этому интерфейсу.
А я "? extends Papa3rdPartyIface" понимаю как "что угодно являющееся потомком Papa3rdPartyIface".
Если нужен лист с объектами какого-то одного класса, то так и пишут List<KakojtoKlass>.
List< Papa3rdPartyIface> будет как раз "что угодно являющееся потомком Papa3rdPartyIface"
безусловно

A extends T
B extends T

List<? extends T> a = new List<A>()
List<? extends T> b = new List<B>()

you can not do a.add(B.getObj)
согласен.
но все вышенаписанное нифига не обясняет наблюдаемой картины. Я не создаю лист. Лист ворвращается методом с сигнатурой "public List<? extends Papa3rdPartyIface> gimmeIt();".
Я даже не могу написать

Code: Select all

		List<Papa3rdPartyIface> lst = someObj.gimmeIt();
бо получаю

Code: Select all

gnr/MyClz.java:12: error: incompatible types: List<CAP#1> cannot be converted to List<Papa3rdPartyIface>
                List<Papa3rdPartyIface> lst = someObj.gimmeIt();
                                                             ^
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Papa3rdPartyIface from capture of ? extends Papa3rdPartyIface
1 error
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
Ann4Ann
Уже с Приветом
Posts: 1239
Joined: 14 Nov 2002 23:02
Location: S.Peterburg, Russia -->SoFla

Re: Джавщики, не дайте впасть в безумие...

Post by Ann4Ann »

User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Пасиб. Объясняет. Но не помогает.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Ion Tichy wrote: 01 Mar 2018 06:13
Пасиб. Объясняет. Но не помогает.
В исходнике приходится кастить вернутый лист к "Лист<МойКласс>" и в ран-тайм или держать пальцы крестиком или делать доп.проверки на кастабильность. Куул.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Анечка, пасиб :love:
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
Ann4Ann
Уже с Приветом
Posts: 1239
Joined: 14 Nov 2002 23:02
Location: S.Peterburg, Russia -->SoFla

Re: Джавщики, не дайте впасть в безумие...

Post by Ann4Ann »

в новый лист с простой сигнатурой все сложить запрещено?

tipa:
List<Papa3rdPartyIface> lst = new LinkedList<>(); or whatever you use
lst.addAll(someObj.gimmeIt());
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Джавщики, не дайте впасть в безумие...

Post by Ion Tichy »

Ann4Ann wrote: 01 Mar 2018 06:27 в новый лист с простой сигнатурой все сложить запрещено?

tipa:
List<Papa3rdPartyIface> lst = new LinkedList<>(); or whatever you use
lst.addAll(someObj.gimmeIt());
Можно. Теперь, когда понятно что я получаю из гиммеИт(), можно всякое попробовать. Тем более что модель в первом посте _сильно_ упрощена по сравн. с реальностью. В реале есть еще охапка tribal knowledge и прочих упрощателей/усложнителей жизни.

В общем case closed, всем пасиб а Анне - большой пасиб.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...

Return to “Вопросы и новости IT”