# <T extends Number>



## pegu (2. Mai 2010)

Hey, bin neu hier und hoffe ich bin richtig!
Falls es schon ne Lösung hier gibt - steinigt mich - aber ich hab leider nix gefunden.. 

*Aufgabe:*

Ich soll ein Programm schreiben um den Flächeninhalt von Quadrat, Rechteck, Dreieck und Kreis berechnen (alle 4 haben ne eigene klasse)
Die Attribute sollen generisch und vom datentyp eines kindes der klasse number sein.. also Integer, Double usw.. 
Klassen sollen alle IFlaecheninhalt implementieren:


```
public interface IFlaechenInhalt {
public double gibFlaechenInhalt();
}
```

Dann soll ich ein hauptprogramm schreiben, das ein IFlaecheninhalt-Array mit 8 Elementen von jeweils zwei Objekten der Klassen (also eins mit Integer - Attributen und eins mit Double - Attributen) anlegt
und dann halt natürlich den Flächeninhalt ausrechnet und ausgibt.

*Was ich soweit hab:*

Die Klassen Dreieck, Kreis, Quadrat und Rechteck. Ich geb jetzt hier mal nur Rechteck an da der rest gleich aufgebaut ist. 

```
package Aufgabe5I;

public class Rechteck <T extends Number> implements IFlaechenInhalt {

	// Attribute
	public T breite;
	public T hoehe;
	
	
	// getter + setter
	public T getBreite() {
		return breite;
	}

	
	public void setBreite(T breite) {
		this.breite = breite;
	}

	public T getHoehe() {
		return hoehe;
	}

	public void setHoehe(T hoehe) {
		this.hoehe = hoehe;
	}

	

	// Konstruktor
	public Rechteck(T Integer, T Double) {
	}

	

	// Fläche berechnen
	public double gibFlaechenInhalt() {
		double flaecheRechteck;
		flaecheRechteck = breite.doubleValue() * hoehe.doubleValue();
		return flaecheRechteck;
	}

}
```

*Klasse Hauptprogramm:*


```
package Aufgabe5I;

import java.util.ArrayList;

public class Testprogramm {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ArrayList<IFlaechenInhalt> formen = new ArrayList<IFlaechenInhalt>();

		// Dreieck hinzufügen
		formen.add(new Dreieck<Integer>(5, 4));
		formen.add(new Dreieck<Double>(5.4, 3.5));

		// Kreis hinzufügen
		formen.add(new Kreis<Integer>(4));
		formen.add(new Kreis<Double>(3.9));

		// Quadrat hinzufügen
		formen.add(new Quadrat<Integer>(5));
		formen.add(new Quadrat<Double>(5.4));

		// Rechteck hinzufügen
		formen.add(new Rechteck<Integer>(5, 4));
		formen.add(new Rechteck<Double>(5.4, 7,5));

		
		
				
		int lauf = 0;
			
		for (IFlaechenInhalt x : formen) {
			System.out.println(lauf + ". Stelle = " + x.gibFlaechenInhalt()); lauf++;
		

		}
	}
}
```

*Und zum Schluss noch die Probleme:*

aaaalso: Funktionieren tut eigentlich gar nichts. Es geht schonmal los mit dem Konstruktor in den einzelnen Klassen. Ich weiß leider nicht wie der ausschaun muss und dass Eclipse - wenn der konstruktor leer ist - rummeckert dass Integer und Double nicht definiert ist. 
In dem Fall hier mault er nur noch beim Double. 
wie mach ich das besser?

und dann weiß ich auch nicht ob

flaecheRechteck = breite.doubleValue() * hoehe.doubleValue();

das hier so stimmt. auf jeden fall wird ohne das .doubleValue() " * " nicht akzeptiert.. was ist in dem fall mit Integer werten? die müssten ja auch als double ausgegeben werden oder?

und ausgegeben wird leider gar nichts.. 

würd mich echt rießig über hilfe freuen


----------



## SlaterB (2. Mai 2010)

>    public Rechteck(T Integer, T Double) {
>    }

ist Quark, welchen Sinn soll das haben?
dein Attribut heißt doch auch

public T breite;
und nicht
public T Integer;

-----

> und ausgegeben wird leider gar nichts.. 

läuft das Programm denn schon? wenn du noch nichtmal weißt wie du die Konstruktoren schreiben willst, dann muss der ganze Rest ja nicht unbedingt gehen,
schreibe auf jeden Fall
System.out.println("start");
System.out.println("ende");
als erste und letzte Zeile in der main-Methode, damit die Grenzen definiert sind


----------



## Marco13 (2. Mai 2010)

Solange es nicht compiliert ist, kann auch nichts ausgegeben werden. Der Konstruktor sollte wohl etwa so aussehen

```
...
    public T breite;
    public T hoehe;
[b]    
    // Konstruktor
    public Rechteck(T breite, T hoehe) 
    {
        this.breite = breite;
        this.hoehe = hoehe;
    }
[/b]
```

Das mit dem .doubleValue() müßte stimmen.


----------



## pegu (2. Mai 2010)

Danke schonmal für die hilfe!!
hab jetzt meine konsturktoren so wie von marco empfohlen geändert und die Grenzen angebaut, jetzt läuft es sogar aber das ergebnis stimmt noch nicht ganz:



> start
> 0. Stelle = 10.0
> 1. Stelle = 9.450000000000001
> 2. Stelle = 50.26548245743669
> ...



wie krieg ich jetzt die ausgabe bei stelle 0, 2, 4 und 6 auch als int? Das liegt wohl an dem .doubleValue oder?
kann ich vielleicht irgendwie überprüfen ob ich Integer oder Double hab und dann je nachdem .intValue oder .doubleValue verwenden?


*Edit:*
Ich glaub ich weiß warum.. methode + das attribut der fläche ist ja double.. wie soll er dann nen int ausgeben können. liegt es daran? 

wenn ja stimmt die aufgabe jetzt weil in der angabe steht ja drin dass gibFlaechenInhalt() ein double ist.


----------



## Marco13 (2. Mai 2010)

Ja, dass das ein double ist müßte so stimmen.


----------

