Generics - Typ

Status
Nicht offen für weitere Antworten.

20seconds

Neues Mitglied
Hallo,
ich habe die den Typ (object.getClass() in einer variablen gespeichert.
Jetzt würde ich gerne diesen Typ als Typparameter übergeben. aber leider meckert eclipse hier. Ich hoffe das Codebeispiel macht mein anliegen etwas deutlicher....

Java:
Class<?> columnType = xxxxxx;
.........
this.add( new SimpleColumn<columnType >() );

Intuitiv habe ich eine Idee warum es nicht klappt, aber wie kann ich das gewünschte erreichen?

Danke
 
S

SlaterB

Gast
es geht wahrscheinlich technisch nicht,
viel wichtiger aber ist aber, dass es für dich als Programmierer überhaupt keinen Sinn macht,
was versprichst du dir davon?
 
J

JochenR

Gast
Hallo,

also ich habe das gleiche Problem - ist es nicht doch irgendwie möglich? Ich finde durchaus, dass das Sinn machen kann. Ich habe zum Beispiel eine Klasse Section. Die Nodes haben eine assoziation zu einem (eigenen) typ, am besten codebeispiel:

Was ich bisher habe:

[Java]

public class Section {

private MyType type;
private String content;

public Section(MyType type, String content) {
this.type = type;
this.content = content;
}

}

[/Java]

Das funktioniert zwar im Prinzip (ganz ohne generics) is aber nicht schön, da ich viele Methode habe wie:
[Java]
public static String doSomethingIfTypeIsSpecialType(Section s) {
if(s.getType() instanceof SpecialType) {
return doAllNiceStuff(s.getContent());
} else {
throw new WrongTypeBrick(); //everything breaks
}
}
[/Java]

Das ist ziemlich häßlich UND unsicher. Besser wäre es die Klasse Section generisch zu haben, dann würde die Methode so aussehen:


[Java]
public static String doSomethingIfTypeIsSpecialType(Section<SpecialType> s) {
return doAllNiceStuff(s.getContent());
}
[/Java]

So würde man sofort sehen was für Sections man da reinwerfen soll/kann. Allerdings weis ich nicht wie ich die generischen Sections dann erzeugen kann, wenn ich nur die Klasse habe. Eine factory-methode müsste irgendwie so aussehen:


[Java]
public static Section<? extends Type> createTypedSection(String content, MyType type) {
Class typeClass = type.getClass();
return new Section<typeClass>(content);

}
[/Java]

..was natürlich überhaupt gar nicht funktioniert. :-( Aber was kann ich tun?
Vielen Dank für jegliche Hilfe!
 
S

SlaterB

Gast
sagen wir, ein String content ist gegeben, daraus wird über die statische Methode

Section<AnyType> x = createTypedSection(..);

was machst du nun mit x? übergibst du x in jedem Fall an die Methode doSomethingIfTypeIsSpecialType?
doSomethingIfTypeIsSpecialType(x);

was soll dann passieren? Compilerfehler zu Generics usw. scheiden aus,
der Compiler weiß ja nicht, was das für ein String/ Typ im laufenden Programm ist,

soll die Methode doSomethingIfTypeIsSpecialType vielleicht nur dann doAllNiceStuff verrichten, wenn der Typ passt?
sowas macht man normalerweise mit einem if,
dass du dir diesen Code ersparen kannst und es automatisch im Hintergrund passiert, halte ich nicht für förderlich

halbwegs denkbar ist noch, dass es mehrere doSomething-Methoden gibt, für x verschiedene Typen, und das Programm selber die richtige wählt, ohne dass man selber if/else/switch schreiben muss,
wiederum gilt: sowas gibts nicht in Java,
der Compiler weiß immer genau, welche Methode gemeint ist, es wird 'statisch gelinkt', abgesehen vom Thema Vererbung,
nur Methoden gleicher Signatur in unterschiedlichen Klasse können sich überlagern, nicht verschiedene Methoden in einer Klasse
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
vielleicht meinst du auch etwas in folgender Richtung, wobei der String dann erstmal keine Rolle spiele

Java:
public class Test {
    public static void main(String[] args) {
        Section<Type> s1 = createTypedSection("", new Type());
        Section<SpecialType> s2 = createTypedSection("", new SpecialType());
        doSomethingIfTypeIsSpecialType(s1); // Compilerfehler
        doSomethingIfTypeIsSpecialType(s2);
    }

    public static <T extends Type>Section<T> createTypedSection(String content, T type) {
        return new Section<T>();
    }

    public static String doSomethingIfTypeIsSpecialType(Section<SpecialType> s)  {
        return "supi";
    }
}
class Section<T extends Type>{}
class Type {}
class SpecialType  extends Type {}
 

fastjack

Top Contributor
Irgendwie habt ihr da was verdreht :

Java:
Class<?> columnType = xxxxxx;

damit erzeugst Du eine Instanzvariable vom Typ Class<?> mit dem Wert xxx.

Java:
this.add( new SimpleColumn<columnType >() );

Hier versucht Du anstatt eines generischen Typen, diese Instanzvariable anzugeben. Da muß aber ein Typ hinein, Variable und Typ nicht verwechseln :rtfm:

Besser Du machst eine Schnittstelle ColumnType und sagen wir eine implementierende Klasse :

Java:
public interface ColumnType { ... }

Java:
public class DefaultColumnType implements ColumnType { ... }

SimpleColumn müßte ungefähr so aussehen :

Java:
public class SimpleColumn<T extends ColumnType> { ... }

wobei T der generische Typ ist, den SimpleColumn in seiner Implementierung nutzt. T muß eine Erweiterung/Implementierung von ColumnType sein.

Und so wirds wieder gerade : :applaus:

Java:
this.add(new SimpleColumn<DefaultColumnType>());
oder
Java:
this.add(new SimpleColumn<ColumnType>());
 
J

JochenR

Gast
Hallo SlaterB,

genau das aus Deinem letzteren Code-beispiel meine ich. So möchte ich das machen, der Content-string ist eigentlich völlig egal.
Das Problem ist nur, dass ich keine T's habe. Die kommen erst zur Laufzeit rein, ich kriege eine Instanz von Type. Wegen dem Plugin-Mechanismus ist zur compile-zeit auch gar nicht klar, was für Typen das alles sein können. Wahrscheinlich gibt es da für diesen Fall keine Lösung, oder ?

Trotzdem vielen Dank für die Hilfe.
 
S

SlaterB

Gast
ich könnte darauf praktisch mein gesamtes Posting von 17:33 wiederholen, besonders den Punkt

was machst du nun mit x? übergibst du x in jedem Fall an die Methode doSomethingIfTypeIsSpecialType?
[..]
was soll dann passieren?
vor allem was soll passieren, wenn der Typ nicht passt..


----

allgemein nehme ich an, dass man an irgendeiner Art Fallunterscheidung nicht vorbeikommt, ja
falls dir instanceof usw. suspekt ist, kann man Objekten einmalig einen Enum-Wert zuweisen, der den Typ beschreibt,
da hat man ne abgeschlosse Menge bekannter Werte, switch ist möglich und einfache Vergleiche,
auch als Key für eine Map gut geeignet
 
J

JochenR

Gast
ähh, upps. :-0
Dein Code funktioniert wirklich, oder?

Shit - sorry, habs ned gerafft. Wenn dem so ist - dann nochmal ein dickes Dankeschön hinterher, dann ist nämlich mein Problem gelöst.

Ich habe (is wohl offensichtlich) das mit den Typen (T's) noch ned so ganz begriffen.

Wegen der Fallunterscheidung: Ne da muss keine hin. Bestimmte Methoden machen nur für speziell ausgeprägte Sections Sinn. Man hat die immer ganz viele Sections und weis gar nicht welche jeweils welchen Typ hat, und ob man jetzt die richtige in soeine Methode reinwirft - deswegen wären ( sind ;-)) die generics extrem hilfreich.

thumbs up!
 
J

JochenR

Gast
Ich hab das jetzt bei mir reingehackt - läuft. Allerdings hab ich da noch eine Frage zu raw types. Wenn jemand eine Section variable unausgeprägt benutzt (was ich nicht überall verhindern kann), dann kann er diese auch noch immer in die doSomethingIfTypeIsSpecialType-methode werfen. Ich hätte da jetzt wenigstens ein Art CastException zur Laufzeit erwartet.
Folgendes Beispiel läuft aber durch und sagt: "supi":

[Java]

public class GenericsTest {
public static void main(String[] args) {
Section<Type> s1 = createTypedSection("", new Type());
Section<SpecialType> s2 = createTypedSection("", new SpecialType());
// doSomethingIfTypeIsSpecialType(s1); // Compilerfehler
doSomethingIfTypeIsSpecialType(s2);

System.out.println(doSomethingIndirectly(s1));
}



public static <T extends Type>Section<T> createTypedSection(String content, T type) {
return new Section<T>();
}

public static String doSomethingIndirectly(Section s) {
return doSomethingIfTypeIsSpecialType(s);
}

public static String doSomethingIfTypeIsSpecialType(Section<SpecialType> s) {
return "supi";
}
}
class Section<T extends Type>{}
class Type {}
class SpecialType extends Type {}

[/Java]
 
S

SlaterB

Gast
Java:
        public static String doSomethingIfTypeIsSpecialType(Section<SpecialType> s)  {
            return "supi";
        }
ist zur Laufzeit
Java:
        public static String doSomethingIfTypeIsSpecialType(Section s)  {
            return "supi";
        }
Generics gibts da nunmal nicht,

interessant wird es wenn es wie bei List etwa eine get-Methode gibt
Java:
T get()

----

        public static String doSomethingIfTypeIsSpecialType(Section<SpecialType> s)  {
           SpecialType type = s.get();
            return "supi";
        }
wird zur Laufzeit zu
Java:
Type get() // da T als T extends Type definiert ist

----

        public static String doSomethingIfTypeIsSpecialType(Section s)  {
           SpecialType type = (SpecialType) s.get();
            return "supi";
        }
dann gibts die Exception
 
J

JochenR

Gast
Ok, ich kann also bei meinem Problem generics verwenden, aber sie tun nicht wirklich das, was ich erhofft hatte. Ich hätte halt gerne auf den ersten Blick am Fehler gewusst, ob der Fehler _in_ der Methode liegt, oder ob der Aufrufende was falsch übergeben hat. Bei folgendem Beispiel würde bei einem Aufruf mit einer falschen Section die Variable tableContent null sein (weil es dann z.b. keinen Ancestor von dem typ gibt). Dann weis man leider nicht ob der Fehler in der Methode liegt, in der Struktur des (doppelt verketteten) Section-baums oder einfach nur beim Aufrufenden liegt. Naja, es bleibt halt wohl doch nichts übrig als, überall die Input-typen genau zu überprüfen.

Java:
public static int getRow( Section<TableCellContent> section )
	{
		Section tableContent = Utils.getAncestorOfType( section, TableContent.class );
		List<Section> sections = new ArrayList<Section>();
		getCertainSections( tableContent, TableLine.class.getName(), sections );
		
                // some other wierd code....
		/*int col = getColumn(section)-1;
		for(int i = 0; i < sections.size(); i++)
		{			
			List<Section> tmpSections = new ArrayList<Section>();
			getCertainSections( sections.get(i), TableCellContent.class.getName(), tmpSections );
			if(tmpSections.size() > col && tmpSections.get(col).equals( section )) return i + 1;
		}*/
		return 0;
	}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben