Generics

Status
Nicht offen für weitere Antworten.

turkey0815

Mitglied
Hallo,

ich habe gerade einen Knoten im Kopf, vielleicht kann mir jemand helfen ihn zu lösen ... würde mich freuen.

Ich habe mich ein wenig mit generischen Typen beschäftigt und habe eine Frage, wie man einen generischen Parameter an eine Methode übergibt, so dass er Einfluss auf den Rückgabewert hat.

Beispiel:
Code:
class Boss{
	public void delegate(){
		Butler b = new Butler();
		b.response(new Task());
	}
}
	
class Butler{
	public LinkedList response(Object obj){
		return new LinkedList();
	}
}

Der Butler bekommt von mir ein Task-Objekt überreicht und soll jetzt eine LinkedList erzeugen, daie nur Task-Objekte in sich aufnehmen kann. Die Frage ist also, wie man in Abhängigkeit eines Parametertyps eine generische Klasse typsicher machen kann.

André
 

Wildcard

Top Contributor
Code:
 public void delegate()
  {
	  response("blah");
  }
  
  public <T>List response(T a)
  {
	  List<T> list = new LinkedList<T>();
	  list.add(a);
	  return  list;
	  
  }
 

turkey0815

Mitglied
Hallo Wildcard,

danke für die schnelle Antwort, dass habe ich soweit verstanden. Leider kann ich es trotzdem nicht auf mein konkretes Beispiel anwenden.

Ich habe eine Klasse DataManager, die alle Abfragen übernehmen soll. Ich setze db4o ein ... tut aber nix zur Sache. Eine Abfrage sieht in etwa so aus:

Code:
List <Pilot> pilots = db.query(new Predicate<Pilot>() {
    public boolean match(Pilot pilot) {
        return pilot.getPoints() == 100;
    }
});

Ich möchte das Ganze jetzt entkoppeln:

Code:
public class DataBridge
	public ObjectSet query(Predicate p){
		return dbLink.query(p);
	}
}

public class MyClass{
		public Test(){
			DataBridge d = new DataBridge();
			List <Pilot> = d.query(new Predicate<Pilot>() {
			    public boolean match(Pilot pilot) {
			        return pilot.getPoints() == 100;
			    });
		}
	}

Jetzt bringt mir Eclipse eine Warnung, das das ganze nicht typsicher ist und Predicate in DataBridge nach einem konkreten Typ verlangt. An dieser Stelle weiß ich den Typ aber noch nicht. Ich erstelle das Abfrageobjekt in einer anderen Klasse, dort kann ich natürlich den Typ angeben, aber das reicht dem Compiler nicht. Man müsste also irgendwie noch offen lassen, welcher Typ verwendet werden soll. Es ist aber wichtig, dass der Rückgabewert vom Parameter (Predicate) abhängt. Macht man so etwas mit <?> ?

André
 

Wildcard

Top Contributor
Ich verstehe dein Problem nicht wirklich...
Wo ist der Unterschied zu dem von mir geposteten Code?
Sorry, war ein langer Tag :wink:
Hier ist eine ziemlich gute Erklärung, vieleicht hilft dir das, ansonsten musst du's mir nochmal genauer erklären :D
 

turkey0815

Mitglied
Hallo Wildcard,

Wildcard hat gesagt.:
Ich verstehe dein Problem nicht wirklich...
Wo ist der Unterschied zu dem von mir geposteten Code?

Kann sein dass ich die Lösung nur nicht sehe, das Kapitel Generics in der Java Insel habe ich mir auch schon bevor ich gepostet habe durchgelesen.

In deinem Beispiel bekommt die Methode als Parameter eine Klasse vom Typ Task übergeben. Mit deiner Lösung kann ich den Typ jetzt verwenden, um eine generische Klasse, wie LinkedList zu typisieren. In dem neuen Beispiel wird eine Instanz von Predicate, die eine generische Klasse ist und bereits vor der Übergabe einen Typ bekommen hat, an die Methode query übergeben. Die Methode gibt nun ein Listobjekt zurück, dem ich ebenfalls einen Typ zuweisen muss und zwar nicht dem Typ "Predicate" (wie in deinem Beispiel), sondern dem Typ "Pilot", der ja irgendwie in Predicate drinnen steckt.

Ich habe es mal so probiert:

Code:
public class DataBridge 
   public ObjectSet<?> query(Predicate<?> p){ 
      return dbLink.query(p); 
   } 
} 

public class MyClass{ 
      public Test(){ 
         DataBridge d = new DataBridge(); 
         List <Pilot> = ( List <Pilot>)d.query(new Predicate<Pilot>() { 
             public boolean match(Pilot pilot) { 
                 return pilot.getPoints() == 100; 
             }); 
      } 
}

So gibt es zwar keine Typwarnung mehr, aber ich muss in der Testmethode von List<?> zu List<Pilot> casten. Dann macht das Ganze doch keinen Sinn.

Ich habe anfangs die Frage falsch gestellt, weil es sich ja nicht um den Typ des Parameters handelt, der weitergereicht werden soll, sondern um den Typ mit dem eine generische Klasse typisiert wurde.

André
 

Kola

Aktives Mitglied
Vielleicht willst du die Klasse "Databridge" typisieren?
Hab leider kein Codebeispiel, aber das sollte funktionieren:
Code:
public class Databridge<T>
{
    public Objectset<T> query(......
......
}
 

turkey0815

Mitglied
Danke Kola für Deine Antwort, aber die DataBridge möchte ich nicht typisieren. Ich gehe zwar mittlerweile auch davon aus, dass es sich bei meiner Problematik um einen konzeptionellen Fehler handelt, aber ich habe keine andere Idee.

Der Hintergrund ist, dass ich nicht sämtliche Klassen auf die Datenbank zugreifen lassen möchte. Der Datenbankzugriff soll über die Klasse DataBridge erfolgen, also auch alle queries. DataBridge ist ein Singelton, es macht also auch keinen Sinn die Klasse generisch zu machen, weil sie ohnehin nur mit einem Typ zur Laufzeit typisiert werden könnte. Die DataBridge holt aber alle möglichen Typen aus der Datenbank. Welcher Typ bei der jeweiligen Abfrage eine Rolle spielt, das weiß Predicate (typisiert). Jetzt muss die zurückgegebene Liste auch typisiert werden und zwar mit dem gleichen wie Predicate.

Da kommt mir gerade eine Idee, wie wäre es, wenn man zusätzlich zu Predicate noch ein Object vom Ziel-Typ übergibt? Dann könnte man das Beispiel von Wildcard nutzen. Dabei können natürlich auch Fehler passieren, wenn man Predicate mit einem anderen Typ typisiert, als der Typ des 2. Parameters. Was haltet ihr von der Lösung?

Code:
public class DataBridge 
   public <T>ObjectSet query(Predicate<?> p, T obj){ 
      return dbLink.query(p); 
   } 
}

Andre
 

Kola

Aktives Mitglied
Einen zweiten Parameter, nur um den Typ festzulegen, halte ich nicht für optimal. Vielleicht haben deine Daten Gemeinsamkeiten, sodaß man mit Polymorphismus arbeiten kann? Im Zweifelsfall würde ich die Typisierung dann eher weglassen...Wenn ich eine Kiste tragen muß, dann ist es mit ja auch egal, ob in der Kiste Äpfel oder Birnen sind.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben