TreeMap Rückgabe - Compiler-Warnings

huckleberry

Bekanntes Mitglied
Hallo Forum,

ich bekomme nach dem Compilieren Warnings, welche ich gerne beheben will.
Da ich in Java nicht sehr Erfahren bin, es gerne aber lernen würde, bin ich bemüht, es zu verstehen.
Compiler-Warnings an der entsprechenden Stelle als Fussnoten /*<nummer>*/ ganz unten..
Java:
/...blabla
TreeMap<Double, SpecialObj> myTreeMap = new TreeMap<Double, SpecialObj>();
myTreeMap = calculateSometing(time, para2,  para3); /*1*/

public TreeMap calculateSometing(long time, SpecialObj myObj, int parameter3) {
		//....blabla
		myTreeMap.put(anyDouble, anySpecialObj); /*2*/
		Iterator<SpecialObj> it = blabla.values().iterator();
		while(it.hasNext()){
				SpecialObj v = it.next();
				v.getAny(d);
				if(Bedingung){
					// put vehicles into TreeMap
					myTreeMap.put(d, v); /*2*/
				}
		}
                //...blabla
                return myTreeMap;


/* --> 1
Type safety: The expression of type TreeMap needs 
 unchecked conversion to conform to 
 TreeMap<Double,SpecialObj>
*/

/* --> 2
Type safety: The method put(Object, Object) belongs to 
 the raw type TreeMap. References to generic type 
 TreeMap<K,V> should be parameterized
*/
//blabla...

Vielen Dank für eure Hilfen und
mfg Huck
 
Zuletzt bearbeitet:
Ein Objekt zu Erzeugen und direkt mit dem Objekt zu "überschreiben", das von der Methode geliefert wird, macht keinen Sinn - auch wenn es in diesem Fall dasSELBE Objekt ist...
Code:
...
TreeMap<Double, SpecialObj> myTreeMap = calculateSometing(time, para2,  para3); /*1*/

...

public TreeMap<Double, SpecialObj> calculateSometing(long time, SpecialObj myObj, int parameter3) {
    TreeMap<Double, SpecialObj> myTreeMap[b]WhichIsOnlyUsedInThisMethod[/b] = new TreeMap<Double, SpecialObj>();
    myTreeMap[b]WhichIsOnlyUsedInThisMethod[/b].put(anyDouble, anySpecialObj); /*2*/
        //....blabla
...
 
myTreeMap in Zeile 7 scheint nicht myTreeMap in Zeile 2 zu sein, oder?
solche doppelten Variablennamen ohne Erklärung sind verwirrend,

Zeile 2 und 3 zeigen übrigens einen häufigen Anfängerfehler,
wenn man einen Parkplatz für ein Auto baut, dann betoniert man doch nicht 8m^2,
stellt einen nigelnagelneuen VW drauf, und verschrottet ihn 1 sec später,
um dann den richtigen Wagen abzustellen..

lasse die Variable anfangs leer:
Type variable = null;
variable = ladeWert();

oder gleich
Type variable = ladeWert();

-----

in der Methode calculateSometing erzeugst du offensichtlich eine Map mit Double -> SpecialObj,
dann definiere die Variable treeMap dort auch als TreeMap<Double, SpecialObj>, nicht einfach als TreeMap

und schreibe
public TreeMap<Double, SpecialObj> calculateSometing
statt
public TreeMap calculateSometing




@Marco13
> auch wenn es in diesem Fall dasSELBE Objekt ist...

wie kann es dann aber zu den Warnings kommen?
 
Ach entschuldigung, hab was vergessen:
Java:
TreeMap<Double, SpecialObj> myTreeMap = new TreeMap<Double, SpecialObj>();
myTreeMap = calculateSometing(time, para2, myTreeMap); /*1*/

public TreeMap calculateSometing(long time, SpecialObj myObj, TreeMap myLocalTreeMap) {
/..
return myLocalTreeMap;
}
Ein Objekt zu Erzeugen und direkt mit dem Objekt zu "überschreiben", das von der Methode geliefert wird, macht keinen Sinn
Hmm, Ich brauche diese TreeMap welche doch erst berechnet werden muss.. Wenn es eine elegantere Lösung gibt, immer her damit 😉
 
Achso, jetzt verstehe ich das mit dem VW und Parkplatz.. Wenn ich die TreeMap in calculateSomething definiere ist sie doch nur da sichbar? Ich wollte sie da wo sie steht sichtbar haben.. ?!?! Oder hab ich ein Denkfehler?

in der Methode calculateSometing erzeugst du offensichtlich eine Map mit Double -> SpecialObj,
dann definiere die Variable TreeMap dort auch als TreeMap<Double, SpecialObj>, nicht einfach als TreeMap

und schreibe
public TreeMap<Double, SpecialObj> calculateSometing
statt
public TreeMap calculateSometing
Korrekt a Mundo.. Gracias.. DAS hat /*1*/ beseitigt.
 
Zuletzt bearbeitet:
na mein Beispiel passte nicht so ganz, weil du wirklich insgesamt nur ein Objekt erstellst, nicht zwei,
ist nur die Frage wo, der Aufrufer muss das doch nicht machen und mühsam übergeben,
die Methode kann sich selber eine Map erstellen und die zurückgeben, siehe Code-Beispiel von Marco13
 
Problem gelöst.. Ich danke.
Ich habe es wie Marco es schrieb, Local nochmal definiert und zurückgegeben. Habe mit TreeMaps usw noch wenig Erfahrung 😉

Danke nochmals an alle für die schnelle Hilfe!
Super Forum, werde deswegen weiterhin ungeniert meine Fragen stellen 😛
 
@Marco13
> auch wenn es in diesem Fall dasSELBE Objekt ist...

wie kann es dann aber zu den Warnings kommen?

Indem man es einmal quer durch eine Methode routet, dabei die Typinformation wegfallen läßt. (Dass das, was von der Methode zurückgegeben wird, dasselbe ist, wie das, was reinkommt, erkennt der Compiler nicht).

(Das hast du wahrschreinlich schon gesehen 😳 )

@huckleberry Bei
Java:
TreeMap<Double, SpecialObj> myTreeMap = new TreeMap<Double, SpecialObj>();
myTreeMap = calculateSometing(time, para2, myTreeMap); /*1*/
 
public TreeMap calculateSometing(long time, SpecialObj myObj, TreeMap myLocalTreeMap) {
/..
return myLocalTreeMap;
}
wird genau das gemacht: Es wird ein Objekt übergeben, und dasSELBE wieder zurückgegeben, aber die Typinformationen fallen weg. Mit
Code:
TreeMap<Double, SpecialObj> myTreeMap = new TreeMap<Double, SpecialObj>();
myTreeMap = calculateSometing(time, para2, myTreeMap); /*1*/
 
public TreeMap[b]<Double, SpecialObj>[/b] calculateSometing(long time, SpecialObj myObj, 
    TreeMap myLocalTreeMap[b]<Double, SpecialObj>[/b]) {
/..
return myLocalTreeMap;
}
würde es gehen, aber wie angedeutet wurde ist diese Struktur ziemlich fragwürdig...
 
Indem man es einmal quer durch eine Methode routet, dabei die Typinformation wegfallen läßt. (Dass das, was von der Methode zurückgegeben wird, dasselbe ist, wie das, was reinkommt, erkennt der Compiler nicht).

(Das hast du wahrschreinlich schon gesehen 😳 )
die Warnings kamen aber schon beim Zugriff auf myTreeMap, unabhängig von der Rückgabe,
die übrig bleibende Möglichkeit war ein gleichnamiges Klassenattribut/ statische Variable vom Typ TreeMap 😉

auf eine lokale Variable von anderer Stelle hätte eh nicht zugriffen werden können,
aber ganz egal, war eh noch anders
 
Die Fehlermeldungen aus dem ersten Post hätten durch
Java:
//...blabla
TreeMap<Double, SpecialObj> myTreeMap = new TreeMap<Double, SpecialObj>();
myTreeMap = calculateSometing(time, para2,  para3);
 
public TreeMap calculateSometing(long time, SpecialObj myObj, int parameter3) 
{
        //....blabla
        TreeMap myTreeMap = new TreeMap(); // <<--------------- SOWAS HIER
        ...
m.E. vollständig erklärt werden können (wer weiß schon, wofür "blabla" so alles steht 😉 )

Aber ist ja jetzt erledigt. 🙂
 

Zurück
Oben