Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java generics - dynamicky vybrana spracujuca trieda

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Java generics - dynamicky vybrana spracujuca trieda

Autor: Samot ♂

23:50:53 08.09.2012

S NoSuchMethodException mas pravdu..ale... neuvadzal som cely kod, ktory je
public interface Processor<T extends Serializable>{
//Metoda vrati triedu T
public Class<?> getTypeClass();
...
}



potom cyklus v spracujVsetky() obsahuje podmienku
...
for(Processor<? extends Serializable> processor : processors) {
if(o.getClass().equals(processor.getTypeClass())) {
processor.process(o);
}
}

Tymto spracujem iba zname objekty, ktore vedia spracovat processory. Object bude jednoducho preskoceny.

Na vistor vzore mi vadi, ze v interfeace musis deklarovat metody takto:
public void process(A o);
public void process(B o);
atd.

A to nasledne sposobi:
a.) Vynutenie upravy interfacu kazdym novym processorom.
b.) Definicia process(A o); a process(B o); atd. je v jednej triede.

Citovat příspěvek

 

Re: Java generics - dynamicky vybrana spracujuca trieda

Autor: Natix ♂

23:48:18 07.09.2012

Hm, tak oprava, nedostaneš ClassCastException, ale NoSuchMethodException.

Citovat příspěvek

 

Re: Java generics - dynamicky vybrana spracujuca trieda

Autor: Natix ♂

20:16:42 07.09.2012

Reflection! To už jsi rovnou mohl vyházet generiky a použít raw typy.

Navíc mám pocit, že tohle sice zkompiluješ, ale ve chvíli, kdy uděláš tohle:

Set<Processor<? extends Serializable>> processors = new HashSet<>();
processors.add(new ProcessorA());
processors.add(new ProcessorB());
Object o = new A();
spracujVsetky();

...tak dostaneš ClassCastException

Nevím o co se přesně snažíš, ale zvaž ještě jednou to, co jsem psal níže.

Citovat příspěvek

 

Re: Java generics - dynamicky vybrana spracujuca trieda

Autor: Samot ♂

19:19:11 07.09.2012

Nakoniec som to vyriesil kombinaciou pridanim reflection:
void spracujVsetky() {
...
for(Processor<? extends Serializable> processor : processors) {
Method m = processor.getClass().getMethod("process", new Class[] { o.getClass() });
m.invoke(processor, new Object[] { o });
}
}

Ak by niekoho napadlo lepsie riesenie napiste. Nepozdava sa mi ziskanie metody process pomocou jej mena.
Nechcel som to takto zadrotovat...

Citovat příspěvek

 

Re: Java generics - dynamicky vybrana spracujuca trieda

Autor: Natix ♂

0:09:33 07.09.2012

Docela dlouho jsem si s tím kódem hrál a nevedlo se mi ho nijak rozchodit. A teď když nad tím přemýšlím, tak si myslím, že problém je v tom, že takovýhle návrh nemůže fungovat z principu.

Pokud dáš do jedné kolekce Processor, co umí zpracovávat jenom Áčka, Processor, který umí jenom Béčka, Processor pro Céčka atd., tak nemůžeš pak vzít celou kolekci a chtít po všech procesorech v ní, aby zpracovali Áčko. To umí jenom jeden z nich. Nejspíš proto nejde nastavit ty wildcardy tak, aby ten kód šel zkompilovat.

Pokud potřebuješ různě zpracovávat různé subclassy nějakého společného předka, tak bych navrhoval schovat všechny subclassy za jeden interface a uvnitř dané metody se rozhodoval buď pomocí instanceofů (což není moc čisté) anebo použil visitor pattern: http://en.wikipedia.org/wiki/Visitor_pattern

Citovat příspěvek

 

Java generics - dynamicky vybrana spracujuca trieda

Autor: Samot ♂

18:12:38 06.09.2012

Zdravim, neviem sa pohnut z miesta:

public interface Processor<T extends Serializable>{
public void processObject(T t);
}

public class ProcessorA implements Processor<A> {
public void process(A t) {
System.out.println("Processing A:" + t.getName());
}
}

public class ProcessorB implements Processor<B> {
public void process(B t) {
System.out.println("Processing B:" + t.getName());
}
}

Hlavna trieda pracujuca s objektami:
class Spravca {
private final Set<Processor<? extends Serializable>> processors = new HashSet<Processor<? extends Serializable>>();

void spracujVsetky() {
...
for(Processor<? extends Serializable> processor : processors) {
// samozrejme za A extends Serializable
processor.process(new A());
}
}
}

Na riadku processor.process(new A()); my Eclipse vyhodi chybu "The method process(...) is not applicable for arguments A. "

Ako na dynamicke urcenie triedy ktora spracuje instanciu v cykle?

Vdaka za kazdu radu ako na to.
T.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: