Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Wrapper knihovní třídy

Zdravím,
v projektu ohledně kalendářových dat využívám knihovnu iCal4j, zejména třídu VEvent. Tato třída neimplementuje rozhraní Comparable, tudíž nemá metodu compareTo, kterou bych potřeboval, abych mohl VEventy ukládat do řazeného TreeSetu.
Pokud si napíšu wrapper MyEvent extends VEvent, implementuji Comparable, tak dostávám výjimku:
Exception in thread "main" java.lang.ClassCastException: net.fortuna.ical4j.model.component.VEvent cannot be cast to MyEvent.
Ta je vyhazována na řádce, kde se pokouším přetypovat VEvent na MyEvent.
Hlavička MyEventu:
public class MyEvent extends VEvent implements Comparable<MyEvent>

Jak toto vyřešit / obejít? Díky

Předmět Autor Datum
Ta je vyhazována na řádce, kde se pokouším přetypovat VEvent na MyEvent. mozes sem dat ten riadok?…
MM.. 29.05.2013 21:28
MM..
public static TreeSet<MyEvent> loadEvents(InputStreamReader input) throws IOException, ParserExcepti…
freez2 29.05.2013 21:33
freez2
Takze tie VEvent objekty sa vytvoria v tom new CalendarBuilder() a nemozes nijak ovplyvnit aby v tom…
MM.. 29.05.2013 21:44
MM..
Jo, ty komponenty vytváří už CalendarBuilder sám a neovlivním to.
freez2 29.05.2013 22:02
freez2
No ovlivnis to ked zmenis ten CalendarBuilder kdesi v jeho zdrojakoch :) (resp. to si tam potom rovn…
MM.. 29.05.2013 23:44
MM..
To už si myslím, že je proti licenci, nebo?
freez2 29.05.2013 23:45
freez2
preco? je to opensource ci ne? http://build.mnode.org/projects/ical4j/license.htm l Ja neviem ja to…
MM.. 29.05.2013 23:49
MM..
Ale to co pisal nizsie MaSo je asi najjednoduchsie. Ak ti nevadi ze tie data mas na 2 miestach (raz…
MM.. 29.05.2013 23:54
MM..
Nevadí, na přehlednosti si myslím, že to nestrádá.
freez2 29.05.2013 23:56
freez2
Jsou to reference, takže v tom bych problém neviděl...;-)
MaSo 30.05.2013 09:27
MaSo
Reference to snad neni, vytvaras si vlastny objekt. Keby to bola reference tak je cela java na hlavu…
MM.. 30.05.2013 11:19
MM..
Přesně tak, zkopíruješ referenci, ne objekt... barva se změní v obou autech. Mě to přijde docela log…
freez2 30.05.2013 11:30
freez2
pretoze si vytvoril 2 objekty. Prvy zapis (AUTO Auto1;) vytvoril pamatove miesto pre data, druhy STE…
MM.. 30.05.2013 11:32
MM..
Auto auto1, auto2; V Javě znamená: Auto auto1 = null; Auto auto2 = null; :-)
MaSo 30.05.2013 11:46
MaSo
takto (C++ zapis): Auto *auto1 = null; Auto *auto2 = null; Prave tou * poviem ze co presne chcem od…
MM.. 30.05.2013 11:57
MM..
resp. tak jak to popisujete tak mi tam asi chyba riadok Auto1 = new AUTO; ? Potom ok je to determini…
MM.. 30.05.2013 12:03
MM..
Jo, chybí tam volání konstruktoru, to jsem si ani nevšiml...:) poslední
MaSo 30.05.2013 12:08
MaSo
A navyse potom musis riesit taketo hovadiny http://stackoverflow.com/questions/3144673/java-ob ject-…
MM.. 30.05.2013 11:39
MM..
Ano. V Javě jsou všechno reference (kromě primitivních typů), když chceš deepcopy, tak si musíš vytv…
MaSo 30.05.2013 11:37
MaSo
iCal4j neznám, ale chápu-li správně o co se tady snažíš, tak bych to udělal následovně: public clas…
MaSo 29.05.2013 22:25
MaSo
Vidíš, atribut není špatný nápad. Díky.
freez2 29.05.2013 22:50
freez2
No to jistě není. V OOP vždy upřednostňuj skládání před dědičností.
MaSo 29.05.2013 22:58
MaSo
public static TreeSet<MyEvent> loadEvents(InputStreamReader input) throws IOException, ParserException{
		TreeSet<MyEvent> events = new TreeSet<MyEvent>();
		CalendarBuilder builder = new CalendarBuilder();
		Calendar calendar = builder.build(input);
		ComponentList cl = calendar.getComponents(Component.VEVENT);
		MyEvent event;
		//String summary;
		//Property property;
		for(int i = 0 ; i < cl.size() ; i++){
			event = (MyEvent) cl.get(i);
			//summary = event.getProperty(Property.SUMMARY).getValue();
			//System.out.print(summary);
			//property = event.getProperty(Property.RRULE);
			//if(property != null){

			//}
			//System.out.println(event.toString());
			events.add(event);
		}
		return events;
	}

Výjimka je vyhazována na první řádce v cyklu.
cl.get(i) vrací objekt typu Object

Reference to snad neni, vytvaras si vlastny objekt. Keby to bola reference tak je cela java na hlavu (mozno je, preto ma nezaujima :D). Jak by si potom skopiroval objekt a menil len skopirovany?
P.S. napr.
AUTO Auto1, Auto2;
Auto1.znacka=Skoda;
Auto1.farba=Cervena;
Auto2=Auto1;
Auto2.farba=Modra;
- tvrdis ze v jave sa tym zmenil aj Auto1? (potom povazujem javu za uplne na hlavu :)

takto (C++ zapis):
Auto *auto1 = null;
Auto *auto2 = null;
Prave tou * poviem ze co presne chcem od toho kramu, preto je C++ deterministicke ;) Ok tak uz viem ze v jave su len smerniky a miesto pre data alokuje nejaky duch nahodne, este par diskusii a budem moct robit aj v jave ;DD

iCal4j neznám, ale chápu-li správně o co se tady snažíš, tak bych to udělal následovně:

public class MyEvent implements Comparable<MyEvent> {

    private VEvent event;

    public MyEvent (VEvent event) {
         this.event = event;
    }
   
    // muzes si i v pripade nutnost "zviditelnit" i ostani metody VEventu v MyEventu prostym delegovanim volani
 
    public VEvent getVEvent() { return this.event; }

    public int compareTo( MyEvent myEvent ) {
        // implementace porovnavaci metody 
        // k 1. VEeventu se dostanes pres field event k 2. pres myEvent.getVEvent()
    }
}

v tom cyklu pak bude:

public static TreeSet<MyEvent> loadEvents(InputStreamReader input) throws IOException, ParserException{
		TreeSet<MyEvent> events = new TreeSet<MyEvent>();
		CalendarBuilder builder = new CalendarBuilder();
		Calendar calendar = builder.build(input);
		ComponentList cl = calendar.getComponents(Component.VEVENT);
	        VEvent event;
		//String summary;
		//Property property;
		for(int i = 0 ; i < cl.size() ; i++){
			event = (VEvent) cl.get(i);
			//summary = event.getProperty(Property.SUMMARY).getValue();
			//System.out.print(summary);
			//property = event.getProperty(Property.RRULE);
			//if(property != null){

			//}
			//System.out.println(event.toString());
			events.add(new MyEvent(event));
		}
	

Zpět do poradny Odpovědět na původní otázku Nahoru