a little Ableit-stuff

Status
Nicht offen für weitere Antworten.

Q-Base

Aktives Mitglied
Hallo,

ich habe gerade so ein Problem, was ich nicht so recht lösen kann. Ich habe eine Hand voll Klassen, die immer dieselben Methoden haben sollen, also habe ich mir eine Superklasse geschrieben und alle Klassen davon abgeleitet. Nun habe ich aber folgendes Problem. Nehmen wir kurz an, ich habe zwei Objekte Int & Str, dann sehen die so aus:

Code:
public class Str  extends SuperObj {
	
	public void setValue(String v) {}
	
	public String getValue() {}
	
}

public class Int  extends SuperObj {
	
	public void setValue(Integer v) {}
	
	public Integer getValue() {}
	
}

Die Superklasse sollte dann so aussehen

Code:
public class SuperObj {
	
	public void setValue(Object v) {}
	
	public Object getValue() {}
	
}

So, nun habe ich aber das Problem in meinem Programmcode, dass ich nur noch Object zurück bekomme und dann doch wieder casten muss, was ich nicht will.

Meine ursprüngliche Idee war einfach, dass ich u.U. nur mit der Superklasse arbeite und dann aber trotzdem die Methoden haben, die ich benötige. Aber irgendwo habe ich einen Denkfehler.

Kann mir bitte jemand auf die Sprünge helfen?

Ciao, Q
 

The_S

Top Contributor
Allgemein: Wenn du nur gewährleisten möchtest, dass deine Klassen diese beiden Methoden implementieren, solltest du lieber ein interface implementieren.

Zu deinem Prog: Ich sehe da 4 Möglichkeiten:

1.) beide Varianten in deiner Superklasse implementieren. In der jeweiligen Klasse kannst du dann ja nur jeweils eine Variante implementieren
2.) Das Ganze über 2 Superklassen/interfaces realisieren
3.) Wirklich Object verwenden und casten in kauf nehmen.
4.) generisch arbeiten (ab Java 5)

[edit] diesmal bin ich wohl der langsame ...
 

Q-Base

Aktives Mitglied
Mit den Generics, das geht dann aber auch mit 'inneren' Datentypen, die ich vielleicht nicht möchte, oder?

[edit]
Also wenn ich nur String, Integer,Boolean & URI möchte, kann es auch sein, dass da jemand eine Map einfügt, oder?
 

Wildcard

Top Contributor
Code:
public class SuperObj {
   
   public void setValue(Object v) {}
   
   public Object getValue() {}
   
}
Da kannst du auch alles reinstopfen.
 

The_S

Top Contributor
Mir ist keine Möglichkeit bekannt, wie du Generics auf bestimmte Datentypen beschränken kannst :(
 

tini

Bekanntes Mitglied
Gabs da nicht mal sowas wie
Code:
<T extends V>
?
Dann könnte man für V ne konkrete Klasse einsetzen und somit wären nur Subklassen (und evtl. V selbst) erlaubt.

Bin mir aber nicht sicher, also nicht hauen!
 

The_S

Top Contributor
selbst wenn das gehen würde, wäre es schwer ne Superklasse für Boolean, String, Integer und URI zu finden ;) .
 

tini

Bekanntes Mitglied
Das ist ja dann nicht mehr mein Problem :wink:
Wollte nur einen generellen Hinweis geben.
 

Q-Base

Aktives Mitglied
Also bisher sieht das so aus

Code:
public class InterpVar<T extends String> {
	
	private Object value = null;
	
	public InterpVar(T inner) {
		value = inner;
	}
	
	public void setValue(T value) {
		value = value;
	}
	
	public T getValue() {
		return (T) this.value;
	}

}

Schöner wäre es, wenn es noch irgendwie so wäre ...

Code:
public class InterpVar<T extends String & Integer & Boolean & URI>

(Anm. laut Doku soll da ein & hin, ein | finde ich aber logischer)

Das sind die Basistypen, die ich brauche, inkl <null>. Mehr sollte der Typ nicht annehmen. Aber ich bekomme nicht nur einen Fehler in der Zeile, sondern mehrere und weiß nun wieder nicht, wie ich das effizient lösen kann. Ich habe auch schon in C++ mit Templates aufgegeben und war eigentlich mit Java 1.4 ganz glücklich. Hier scheint es aber richtig zu helfen, wäre also nicht schlecht, wenn es funktioniert. Vielleicht finde ich so auch meinen Einstieg darin :)

Ciao, Q
 

Q-Base

Aktives Mitglied
Also ich habe mich dazu entschlossen

public class InterpVar<T extends String & Integer & Boolean & URI>

ohne 'extends String & Integer & Boolean & URI' zu benutzen. Ich muss zwar immernoch so eine

if (var instanceof Integer)-Orgie machen, aber ein Teil meines Problems ist schonmal gelöst.

Vielen Dank Leute. :)

Ciao, Q
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben