Dez 18

Es kann auch die Wildcard ? mit T ersetzt werden, hier ein letztes Beispiel einer Klassendefinition (zumindest fürs erste ;) ):

class generic_Types <T extends Angestellter>{ .. }

Genau wie bei der Wildcard können in diesem Zusammenhang nur Objekte vom Typ Angestellter oder dessen abgeleiteter Klassen aufgenommen werden.

generic_Types <Angestellter> a_generic= new generic_Types <Angestellter> ();
generic_Types <Buchhalter> b_generic = new generic_Types <Buchhalter> ();

können daher problemlos angelegt werden,

generic_Types <Integer> c_generic = new generic_Types <Integer>();

gibt einen CompilerFehler, da falscher Objekt-Typ

Dez 16

Da generische Klassen gerne im SCJP abgefragt werden, kommen die nächsten Tage noch weitere Beispiele, in diesem Falle eine generische Klasse mit Übergabe von mehreren Werten:

class generic_Types <T, X>{

T t; //Variablenname für Element

X x; //Variablenname für Element

generic_Types(T t, X x){

this.t=t;

this.x=x;

}

}

Hier ist das Besondere die Übergabe von beliebigen Elementen, die dann in den internen Variablen gespeichert und weiterverarbeitet werden können.Hier noch der Vollständigkeit halber noch die Anlage einer Instanz:

generic_Types a_generic= new generic_Types(1, “abc”);

Dez 11

Was Stellvertreter sind, wissen wir nun. Heute geht es um deren Anwendung mit dem Ziel, eine eigene generische Klasse anzulegen.

Gehen wir z.B. davon aus, dass auf allen Listen die gleichen Methoden angewandt werden sollen; in unserem Beispiel wollen wir vielleicht die jeweiligen Listen in einer privaten Variable wegspeichern und mit den gleichen Methoden weiterbearbeiten.

Wir gehen also von folgenden List aus:

List <Angestellter> a= new ArrayList<Angestellter>();
List <Buchhalter> b = new ArrayList <Buchhalter>();
List <Verkäufer> c = new ArrayList <Verkäufer>();
List <Date> d = new ArrayList <Date>();

Ohne eine eigene generische Klasse müsste für jeden Objekt-Typ eine eigene Funktion angelegt werden, in der die List gespeichert wird. Zusätzliche Funktionen für die jeweiligen Objekt-Typen müssten auch mehrfach implementiert werden, so dass der Aufwand ziemlich groß ist.

Deswegen wird eine generische Klasse angelegt:

class generic_Types <T>{

private List <T> list;

generic_Types(List <T> list){

this.list=list;

}

public List get_List (){

return list;

}

}

Hierein können dann ganz komfortabel die verschiedenen Lists gespeichert und bearbeitet werden:

generic_Types a_generic= new generic_Types(a);
generic_Types b_generic= new generic_Types(b);
generic_Types c_generic= new generic_Types(c);
generic_Types d_generic= new generic_Types(d);

Dez 09

Statt der Wildcard, gibt es auch die Möglichkeit, sogenannte Stellvertreter zu definieren;

<E> ist der Platzhalter für alle Arten von Collections

<T> ist der Platzhalter für alle Arten von Nicht-Collections

Daher wird <E> eher bei Methoden, bzw. Übergaben von Collections und <T> eher bei der Defintion/Anlage von Collections benutzt.

Hierbei ist wichtig zu wissen, das dies nur Vorgaben sind; es kann jeder andere Großbuchstabe anstelle von E/T benutzt werden.

Tagged with:
Dez 07

alles was an eine andere Methode übergeben werden kann; kann auch direkt zugewiesen werden:

Deswegen hier nur die genannten Beispiele in  der Zusammenfassung:

List <Angestellter> a = new ArrayList <Angestellter>();
List <Angestestellter> b= new ArrayList <Buchhalter>();
List <? extends Angestellter> c = new ArrayList <Angestellter>();
List <? super Buchhalter> d = new ArrayList <Angestellter>();
List <?> e = new ArrayList <Angestellter>();
List <Object> f = new ArrayList <Angestellter>(); // Type mismatach

List <Object> g = new ArrayList <Object>();

List <? extends Angestellter> h = new ArrayList <Buchhalter>();


List <? extends Angestellter> i = new ArrayList <? super Buchhalter>();
// Type mismatch

List <? super Angestellter>j= new ArrayList <Buchhalter>(); // Type mismatch

Es gelten zusätzlich die gleichen Regeln für das Hinzufügen von Objekten.

Tagged with:
Dez 05

Heute wollen wir uns mal die Übergabe von List ohne jegliche Einschränkungen anschauen:

public static void checkStatus_list (List <?> a){ … }
oder
public static void checkStatus_list (List<Object> a){ … }

Auf den ersten Blick sieht es aus, als wären beide Methoden gleich, aber es gibt Unterschiede:

Bei der Übernahme von  <?> ist die Funktion add(Object) ausgeschaltet; ein CompilerFehler wird ausgeben. Hintergrund ist einfach, dass Probleme bei verschiedenen Objekttypen, bzw. deren späterer Weiterbehandlung vermieden werden soll.

Bei der Übernahme von (List<Object> a) kann auch nur der Typ List <Object> übergeben werden, und keine Subklassen. Somit ist für unser Beispiel (List mit Objekten vom Typ Buchhalter, Verkäufer und Angestellter) diese Methode nicht brauchbar.

Tagged with:
Dez 03

So, heute die nächste Art von Wildcards:

public static void checkStatus_list (List <? super Buchhalter> a){ … }

Dies bedeutet, dass alle Elemente vom Typ Buchhalter oder deren Oberklassen übergeben werden können.

Auch hier ist ein Cast notwendig, um durch die Elemente zu gehen und die jeweiligen Methoden aufzurufen:

for (Object x : a)
System.out.println(((Angestellter)x).getName());

Hier ist aber Vorsicht geboten; es muss zur Oberklasse gecasted werden, da  ansonsten einen Laufzeitfehler (keinen CompilerFehler) auftritt.

Das direkte hinzufügen funktioniert in unserem Beispiel nur beim Typ Buchhalter:

a.add(new Buchhalter());

Es können zwar alle möglichen Elemente vom Typ Buchhalter oder deren Oberklassen übergeben werden, eingefügt werden kann aber nur der aktuelle Typ, da ein heruntercasten nie möglich ist.

Tagged with:
Dez 01

Heute wollen wir die Methode checkStatus_list erneut abändern:

public static void checkStatus_list (List <? extends Angestellter>  a){ … }

Obwohl Serializable ein Interface ist, muss in diesem Falle extends benutzt werden, alles andere ergibt einen CompilerFehler!

Um durch die Objekte durchgehen und überschriebene Methoden aufrufen zu können, ist kein Cast notwendig:

for (Angestellter b : a)
System.out.println(“List yyy ” +b.getName());

Das Hinzufügen weiterer Elemente innerhalb der Methode ist nicht möglich.

Weitere Funktionen dieser Wildcard-Art werden im SCJP nicht abgefragt, deswegen werde ich fürs Erste nicht weiter darauf eingehen.


Tagged with:
Nov 28

Es mag vielleicht die ein oder andere Situation geben, in der man doch die (bis jetzt nicht-) vorhandenen Möglichkeiten, die z.B. Arrays bezüglich Methodenaufrufen bieten, nutzen möchte. Hierfür gibt es eine Art Workaround, gehen wir mal wieder von einer unserer bereits diskutierten Methoden aus:

public static void checkStatus_list (List <Angestellter> a) { … }

Diese kann mit einer sogenannten Wildcard versehen werden und sieht dann so aus:

public static void checkStatus_list (List <? extends Angestellter> a) { … }

Eine List von Buchhalter kann jetzt problemlos übergeben werden:

List <Buchhalter> a =new ArrayList<Buchhalter>();
a.add(new Buchhalter());
a.add(new Buchhalter());

checkStatus_list(a); // kein Compilerfehler!

die mit der Wildcard veränderte Methode nimmt die List Buchhalter problemlos auf. So einfach, wie es momentan aussieht, ist der Workaround leider nicht.

a.add(new Buchhalter());

ergibt z.B. innerhalb der Methode checkStatus_list einen Compilerfehler!


Tagged with:
Nov 25

Das die Zuweisung

a.add(new Buchhalter());
a.add(new Verkäufer());

in unserem vorherigen Beispiel funktioniert, haben wir ja schon vor ein paar Tagen durchgesprochen.

Gehen wir mal davon aus, dass wir überschriebene Methoden haben:

class Buchhalter extends Angestellter{String getName(){ return(“Buchhalter”);}}
class Verkäufer extends Angestellter{ String getName(){ return (“Verkäufer”);}}

Diese Funktionen können direkt und ohne Probleme augerufen werden, weil ja zur Laufzeit nicht mehr zwischen Array und ArrayList unterschieden wird:

System.out.println(a.get(0).getName()); // Ausgabe: Buchhalter
System.out.println(a.get(1).getName()); //Ausgabe: Verkäufer

Tagged with:
preload preload preload
http://www.wikio.de Blog Top Liste - by TopBlogs.de Blogverzeichnis - Blog Verzeichnis bloggerei.de Bloggeramt.de Software
Webbhotell Top Blogs