# java.util.List - Typ überschreiben



## Patrick1986 (21. Aug 2007)

Hallo, 

Ich habe folgendes Problem:
Ich habe eine BasisKlasse, die 2 Klasse leitet diese Basis Klasse ab.
In der Basis KLasse ist ein Attribut definiert vom Typ java.util.List<MyObjectDef>
Nun möchte ich in der 2Klasse die Liste vom Typ MyObjectDef mit dem Typ MyObject überschreiben.
Nur Bekomm ich immer eine Fehlermeldung er kann nicht von MyObjectDef to MyObject casten.
Wie löse ich das Problem am besten.

Zum verständniss. Die BasisKlasse stellt eine Definition eines Formulars da. hat somit auch eine Liste von FormularObject Definitionen. In der 2 Klasse ist es dann ein konkretes Formular. Es hat dann bspw eine liste von ZextObjekten.


FormularDef-Klasse:

```
public class FormularDef {
    private List<FormularItemDef> itemList;

    public FormularDef() {
    }

    public void setItemList(List<FormularItemDef> itemList) {
        this.itemList = itemList;
    }

    public List<FormularItemDef> getItemList() {
        return this.itemList;
    }
}
```

Formular-Klasse:

```
public class Formular extends FormularDef {

    public Formular() {
        // KONKRETES FORMULAR
    }

}
```

Wie man oben sieht leitet Formular die Klasse FormularDef ab und hat somit nun die methode setItemList zurverfügung.

Möchte ich nun der Instans von Formular sagen setItemList(itemList);
Wobei zu beachten ist das itemList vom Typ: List<FormularItem> ist.

Bekomm ich die oben genannte Cast- Exception. 

Nur Wie löse ich das Problem ?!

Danke im vorraus.


----------



## SlaterB (21. Aug 2007)

gehts auch einen Tick ausführlicher?
oben hast du 'MyObjectDef to MyObject', unten ist auf einmal von 'FormularItemDef' de Rede..,
welche ist die zweite Klasse, erben die voneinander,
welche Operationen überschreibt Formular, wo genau tritt die Exception auf? usw.

ersetze vielleicht
private List<FormularItemDef> itemList
durch
private List<? extends FormularItemDef> itemList


----------



## Patrick1986 (21. Aug 2007)

Oh sorry .. habs jetzt auch gesehen n bissel was verdreht .. tut mir leid..

aber das mit ? extends klappt super, nur versteh ich jetzt nicht ganz genau warum die Methode addFormularItem:

```
/**
	 * add formularItem to list
	 * @param item
	 */
	public void addFormularItem (FormularItemDef formularItem) {
		if(this.formularItemList == null) {
			formularItemList = new ArrayList<FormularItemDef>();
		}
		formularItemList.add(formularItem);
	}
```

nicht klappte bekomm immer folgende fehlermeldung:
the method add(capture-of ? extends FormularItemDef) in the List(capture-of ? extends FormularItemDef) is not applicable for the arguments (FormularItemDef)

Ich habe auch schon veruscht 

```
formularItemList = new ArrayList<? extends FormularItemDef>
```

Aber anscheinend kennt das der Konstrukter der ArrayList nicht .. 

Danke schon mal [/code]


----------



## bygones (21. Aug 2007)

sobald du mit Wildcards eine Liste definierst, kannst du keine neuen elemente hinzufuegen.

? extends A

sagen wir du hast Klasse A und die Klassen B und C, die von A erben, dann koennte in der Liste nun Objekte vom Typ B und vom Typ C stehen - und somit ist die Typsicherheit nicht garantiert !

wenn du willst dass das hinzufuegen geht, so muss du einfach List<A> schreiben, dann kannst du aber auch nur Elemente vom Typ A wieder bekommen

achja und instanzieren geht mit Wildcard gar nicht !


----------



## Patrick1986 (21. Aug 2007)

mmh das klingt ja schon irgendwie logisch ...

Gibt es denn keine andere möglichkeit das Problem zu lösen ... ?


----------



## SlaterB (21. Aug 2007)

um die eine List-Definition varaiblen verwenden zu können, brauchst eine dritte Klasse,
eine Basisklasse

public class FormularDefBase<T extends FormularItemDef>  

public class FormularDef extends FormularDefBase<FormularItemDef>  

public class Formular extends FormularDefBase<FormularItem>  


dann erbt Formular allerdings nicht mehr von FormularDef


----------



## Patrick1986 (21. Aug 2007)

ahhh Super danke ...

also ist das T vor extends sozusagen ein übergebener datentyp den ich beim deklarieren einer List mit angebe.. richtig ?

Was mir nun nur auffält ist, das ich im code an jeder stelle wo ich einer instanz von FormularDef
die methode getFormularItemList() aufrufe folgendes stehen hab: 
Type Safty: The Expression of type List needs unchecked conversions to conform to List<FormularDef>

Comeplieren kann ich alles .. aber ich frage mich was das zu bedeuten hat .. 

bei den getter und setter Methoden benutz ich immer die Wildcard als typ für die List.. 

merkwürdig..


Danke schon mal ...


----------



## SlaterB (21. Aug 2007)

redest du von 
List<FormularItemDef>
?
in der Basisklasse muss natürlich überall
List<T>
stehen

oder wirklich von einer Liste von Formularen?


----------



## Guest (21. Aug 2007)

SlaterB hat gesagt.:
			
		

> redest du von
> List<FormularItemDef>
> ?
> in der Basisklasse muss natürlich überall
> ...



Haste schon richtig .. eine Lsite von FormularItemDef...
Ja ich hab überall List<T> stehen.
Die Meldung kommt aber trotzalledem ... das verwundert mich ja gerade eine wenig ..^^


----------



## SlaterB (21. Aug 2007)

wenn du eine konkrete Frage hast, dann poste mehr konkreten Code und weniger inkonkrekte Punkt Punkt Punkt


----------

