Wyszukiwanie w kolekcji po typie generycznym

0

Mam pewną klasę rozszerzającą klasę abstrakcyjną jak poniżej:

public class Element extends BaseElement {
    private int id;
}

Mam też jakąś SomeClass, która implementuje interfejs:

public class SomeClass implements Interface<Element> { }

Kolejne obiekty SomeClass przechowuje w liście. Na problem napotkałem w metodzie:

doSomething(BaseElement baseElement)

Chciałbym w tej liście klas wyszukać odpowiednią instancję po baseElement. Pewnie można jakoś streamem, ale nijak nie mogę tego wymyślić. Macie może jakiś pomysł jak to zrobić?

0

Nie do końca rozumiem o co chodzi.

Masz zbiór elementów typu SomeClass i teraz musisz ją zmatchować z odpowiednim elementem BaseElement? To wtedy zależy od budowy interfejsu.
Jeśli jest jakieś powiązanie, np.

public interface Interface<T> {
	T get();
}

to wtedy sprawa jest prosta - możesz porównać po equals:

void doSomething(BaseElement baseElement){
	collection.stream()
				.findAny(e -> e.get().equals(baseElement))
				// ... do something
}

Jeśli nie ma takiego wiązania to musisz wymyślić jakieś własne kryterium

0

@wartek01: Dokładnie o coś takiego chodzi.
Interfejs jest pusty. Tylko nie mam pojęcia jak z klasy rozszerzającej wyciągnąć coś takiego.

0
kiyo napisał(a):

@wartek01: Dokładnie o coś takiego chodzi.
Interfejs jest pusty. Tylko nie mam pojęcia jak z klasy rozszerzającej wyciągnąć coś takiego.

Jeśli interfejs jest pusty to nie można nic zrobić, bo nie da się określić kryterium. Nie masz żadnej instancji klasy Element, żeby dało się cokolwiek z tym zrobić.

0

Rozumiem. A gdybym napisał jakąś metodę w tym interfejsie z typem generycznym jako parametr? Coś takiego:

public interface Interface<T> {
void method(T t);
}

Z tego chyba da się wyciągnąć typ tego parametru?

4
  1. Type erasure. W runtime twoje Interface<T> oraz Interface<S> będą takie same, bo informacja o typie generycznym jest usuwana (ok ok, nie tak całkiem i da się czarować refleksją, ale to już stąpanie po kruchym lodzie)
  2. Kowariancja i kontrawariancja typów. Wbrew temu co ci się może wydawać, Interface<Element> i Interface<BaseElement> NIE SĄ nijak powiązane mimo że Element extends BaseElement.

Wygląda to na klasyczny http://xyproblem.info/ więc napisz konkretnie jaki problem wyjściowy chcesz rozwiązać.

0

Mam podane struktury danych takie jak w pierwszym poście z założeniem, że klasa SomeClass implementuje interfejs Interface<Element> oraz Element rozszerza SomeElement.
Chyba najłatwiej będzie jak pokaże mniej więcej jak ma to działać:

SomeClass someClass = new SomeClass();
ClassCollection collection = new ClassCollection();
collection.addClass(someClass);
Element element = new Element(1234);
collection.call(element);

W tym momencie powinna wywołać się jakaś metoda doSmething(BaseElement baseElement) w odpowiedniej instancji klasy implementującej Interface<Element>.
Więc mam problem z wybraniem odpowiedniej klasy.

3

Nie nie, ja rozumiem co ty chcesz zrobić w tym wątku, ale to nie jest twój wyjściowy problem. To jest twoje rozwiązanie pewnego problemu (a raczej próba rozwiązania). Co więcej wrzucasz tutaj jakieś oderwane od rzeczywistości przykłady, które jeszcze bardziej nie pomagają. Przeczytaj link który wstawiłem w poprzednim poście, przemyśl sprawę i opisz faktyczny problem.

1

Dlaczego ja mam wrażenie, że brakuje ci tutaj zwykłego wizytatora?

https://www.nurkiewicz.com/2009/03/wzorzec-visitor-realny-przykad.html

Trzeba będzie co prawda trochę zaczarować by to działało, bo masz złą hierarchę wywołać (trzeba je odwrócić), ale powinno być ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1