generische Klasse als Parameter einer generischen Klasse

Status
Nicht offen für weitere Antworten.
G

Gast_Claudia

Gast
Hallo Java-Fans und Nicht-Fans =)
Derzeit beschäftige ich mich mit generischen Klassen, komme damit auch ganz gut klar, aber trotzdem habe ich ein kleines Problemchen, bei dem ihr mir vielleicht helfen könnt:

Code:
public class Range<T> {
	private T start;
	private T end;
	
	public Range(T start, T end) {
		this.start = start;
		this.end = start;
	}
	
	public T end() {
		return this.end;
	}
	
	public T start() {
		return this.start;
	}
}

Ich möchte, dass diese Klasse nur numerische Typen ("<T extends Number>") und Typen von sich selbst aufnehmen kann. Kleines Beispiel: eine Strecke fängt bei mindestens 0 und maximal 1 an und endet bei 6.

Code:
Range r = new Range(new Range(0,1),6);
System.out.println("minimaler Start: " + r.start().start());
System.out.println("maximaler Start: " + r.start().end());
System.out.println("Ende: " + r.start().start());

weitere mögliche Szenarien:
die einfachste Anforderung:
Start = 0;
Ende = 1;

Start beginnt frühestens bei 4, spätestens bei 9 usw...):
Start =
- Start = 4
- Ende = 9
Ende =
- Start = 18
- Ende = 22

diese Typen sollen "unendlich" ineinander verschachtelbar sein.
Hat wer eine Idee?
 

Grasstampfer

Gesperrter Benutzer
man kann - meines wissens - nicht eine ODER bedingung definieren.... d.h. du kannst entweder definieren, dass es dein Parameter Number ist bzw dass vom Typ Range is bzw vom Typ Number UND Range.

aber nicht dass es vom Typ Number oder vom Typ Range ist....

wie sollte es auch - damit ist ja waehrend des compilierens nicht klar um welchen Typ es sich handelt....
 

Marco13

Top Contributor
Hmja, wie Grasstampfer schon gesagt hat, so ein "oder" ist schwierig - vor allem hat man ja ein Problem, weil man nie weiß, was man bekommt:
??? s = range.start(); // Ist das, was man bekommt, ein Range oder eine Number?

Also, bei deinem Beispielcode hattest du ja die Typparameter weggelassen. Wenn man da eine "unendlich" tiefe Verschachtelung braucht, dann braucht man ja auch "unendlich" viele Typparameter :autsch: Wie häßlich das wird, sieht man schon an diesem kleinen Beispiel ... das dem, was du vorhattest zwar relativ nahe kommt, aber trotzdem schon SEHR fragwürdig ist - ein Range IST eigentlich keine Number!... :?

Code:
class RangeTest
{
    public static void main(String args[])
    {
        Range<Range<Integer, Integer>, Integer> r = new Range<Range<Integer, Integer>, Integer>(new Range<Integer, Integer>(0,1),6);
        System.out.println("minimaler Start: " + r.start().start());
        System.out.println("maximaler Start: " + r.start().end());
        System.out.println("Ende: " + r.end());
    }
}


class Range<T extends Number, U extends Number> extends Number
{
   private T start;
   private U end;

   public Range(T start, U end)
   {
      this.start = start;
      this.end = end;
   }

   public T start()
   {
      return this.start;
   }

   public U end()
   {
      return this.end;
   }


    public byte byteValue()
    {
        return start.byteValue();
    }

    public double doubleValue()
    {
        return start.doubleValue();
    }

    public float floatValue()
    {
        return start.floatValue();
    }

    public int intValue()
    {
        return start.intValue();
    }

    public long longValue()
    {
        return start.longValue();
    }

    public short shortValue()
    {
        return start.shortValue();
    }
}

Eine andere Möglichkeit wäre, dass Ranges immer nur andere Ranges enthalten, aber dann muss man irgendwie testen können, ob ein Range "leer" ist (d.h. eine Zahl enthält...) Auch nicht so toll... :?

Code:
class RangeTest
{
    public static void main(String args[])
    {
        Range<Integer> r = new Range<Integer>(new Range<Integer>(0,1),new Range<Integer>(6));
        System.out.println("minimaler Start: " + r.start().start());
        System.out.println("maximaler Start: " + r.start().end());
        System.out.println("Ende: " + r.end());
    }
}


class Range<T extends Number>
{
   private Range<T> start;
   private Range<T> end;
   private T value;

   private boolean empty = false;

   public Range(T startValue, T endValue)
   {
      this.start = new Range<T>(startValue);
      this.end = new Range<T>(endValue);
   }

   public Range(Range<T> start, Range<T> end)
   {
      this.start = start;
      this.end = end;
   }

   public Range(T value)
   {
      this.value = value;
      empty = true;
   }

   public Range<T> start()
   {
      return this.start;
   }

   public Range<T> end()
   {
      return this.end;
   }

   public T value()
   {
      return value;
   }

   public boolean isEmpty()
   {
       return empty;
   }

   public String toString()
   {
       if (empty)
       {
           return value.toString();
       }
       else
       {
           return "["+start.toString()+","+end.toString()+"]";
       }
   }

}

Je nachdem, was du später mit diesen Ranges machen willst, solltest du dir vielleicht was anderes überlegen... oder mal genauer beschreiben, was da rauskommen soll....

Aber vielleicht hat noch jemand eine geschicktere Idee....
 
G

Gast_Claudia

Gast
Tja, was soll eigentlich rauskommen... eben ein flexibler generischer Typ :D
Aber du hast Recht, man kann ja dann nie genau sagen WAS nun das Return ist - das macht ein Compile schonmal unmöglich.

Wenn mans sich anschaulich macht, dann entspräche der Code etwa einem selbst geformten variablen Baum, der nur aus numerischen Früchten und Ästen besteht.
jeder Ast kann sich theoretisch unendlich aufzweigen, hat aber an den Enden immer eine Frucht :)
dieser Baum soll so einfach wie nur möglich auswertbar sein.

Das wäre dann eine Klasse für alles...
praktische Verwendung hätte ich jetzt nicht, aber eine interessante Überlegung ists denk ich allemal.
 

Grasstampfer

Gesperrter Benutzer
dann würde ich eher eine typische verkette Liste nehmen um dann nicht, wie schon beschrieben in sachen wie
Code:
Range<Range<Range<Range<Range<Range<Range<Range<Range<Range<Range>>>>>>>>> // oder wieviele auch immer
zu kommen.
 

Marco13

Top Contributor
Wenn du von einem "Baum" redest, wäre das eher wir das zweite Beispiel, was ich gepostet hatte.... das IST ja ein Baum, dessen Knoten "Range"-Objekte sind. Die Blätter dieses Baumes sind die "leeren Ranges", und nur die können (sollten) eine Value enthalten. Ggf. kann man sich dann auch Methoden schreiben, die das Traversieren übernehmen, womit die Abfragen auf "isEmpty" weitgehend wegfallen...
Code:
class Range<T extends Number>
{
   private Range<T> start;
   private Range<T> end;
   private T value;

  ...

   public T getMin()
   {
        if (start == nul && end == null)
        {
            return value;
        }
        return start.getMin();
    }

  ...
}
Wie gesagt, kommt halt alles auf den Anwendungsbereich an...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
H generische Klasse Realtion Allgemeine Java-Themen 2
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
D Methode für generische enummap/enum Allgemeine Java-Themen 10
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
B Generische Typen instanzieren Allgemeine Java-Themen 11
R Generische Listener und Sender Allgemeine Java-Themen 12
M Generische Datentypen Allgemeine Java-Themen 14
S Generische Liste Allgemeine Java-Themen 30
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben