Java String.format angeblich inkompatibel mit Parametern

Stannis

Lieutenant
Registriert
Juli 2011
Beiträge
549
Tag. Das Programm soll ein wenig mit komplexen Zahlen spielen.
Ich verstehe das Problem nicht, Eclipse meldet mir mehrere Kompilierungsprobleme in den Zeilen 35, 39, 44, 56.
Das Codebeispiel aus Zeile 38 habe Ich sogar aus einer Tutorialwebsite kopiert - das muss stimmen....
Aber scheinbar nicht.

Ich nutze openjdk 1.8 und eben Eclipse 3.8

Der Fehler in Zeile 56 ist ein bisschen anders, aber unverständlicher.
1. Wieso warnt er mich, dass Ich eine Methode überschreibe? Genau das will Ich ja.
2. Was bedeutet hier "the return type is incompatible with object.clone ?

Code:
public final class Complex
{	public static void main(String[] args)
	{
		Complex z1 = new Complex(2.5, -0.7);
		Complex z2 = new Complex(0.5, 1);
		Complex z3 = new Complex(1.25, 0.35);
		Complex z4 = z1.clone();
		
		System.out.println(z1.toString()+"\n"+z1.toPolarString());
		System.out.println(z2.toString()+"\n"+z2.toPolarString());
		System.out.println(z3.toString()+"\n"+z3.toPolarString());
		System.out.println(z4.toString()+"\n"+z4.toPolarString());
	}
	
	private double real, img, betrag, phase;
	
	public Complex(double re, double im)
	{	real = re;
		img = im;
		betrag = Math.sqrt(real*real + img*img);
		phase  = Math.atan2(img, real);
	}
	
	public Complex()
	{	this(0,0);
	}
	
	public Complex(double re)
	{	this(re,0);
	}
	
	public String toString()
	{	return String.format("(%f %c j*%f)", real, (img >= 0)?'+':'-' ,img);
	}
	
	public String wtf()
	{	 String s = String.format("%-12.5f%.20f", 12.23429837482,9.10212023134);
		return s;
	}
	
	public String toPolarString()
	{	return String.format("%f * exp(%f * j)", betrag, phase);
	}
                
	
	public boolean equals(Object obj)
	{	boolean rueck=false;
		if(this == obj)
			rueck = true;
		
		return rueck;
	}
	
	public Complex clone()
	{	return new Complex(real, img);
	}
	
	public int hashCode()
	{	int ziffer=-1;
		if(betrag == 0)
			ziffer = 0;
		else if(phase > 180)
			ziffer = 1;
		else if(phase < 180)
			ziffer = 2;
		
		return ziffer;
	}
}
 
Bin kein Java-Profi aber:
Zeile 33
Code:
t("(%f %c j*%f)"

"%f" inkludiert "j%f", oder vertue ich mich?

Das heißt %f ist immer wahr, auch wenn j*%f eintritt. Also ggf. doppelte Wahr-Bedingung.
 
Funktioniert bei mir mit dem Oracle JDK, probiers mal bei dir damit.

Code:
(2.500000 - j*-0.700000)
2.596151 * exp(-0.273009 * j)
(0.500000 + j*1.000000)
1.118034 * exp(1.107149 * j)
(1.250000 + j*0.350000)
1.298075 * exp(0.273009 * j)
(2.500000 - j*-0.700000)
2.596151 * exp(-0.273009 * j)
 
Es wäre praktisch gewesen, wenn du die Fehlermeldungen, die du bekommst, in deinem Post zitiert hättest. Nicht jeder von uns hat eine passende Java-IDE zur Hand :)

Zu dem clone-Problem:

- Die Override-Warnung dürfte daran liegen, dass du keine @Override-Annotation an der clone()-Methode angebracht hast. Das sollte man immer tun, wenn man eine Methode überschreibt.
- Complex::clone() muss den gleichen Rückgabetyp haben wie die Methode, die sie überschreibt, also Object::clone(). Dieser Rückgabetyp ist Object, nicht Complex. Daher die "return type is incompatible"-Meldung.
- Zusätzlich muss deine Klasse das Interface Cloneable implementieren, wenn das Klonen funktionieren soll. EDIT: Das ist nur dann der Fall, wenn Object::clone() selbst aufgerufen wird, also mit super.clone(). Da du das hier nicht tust, geht's auch ohne Interface.
 
Zuletzt bearbeitet:
@Hooo: Eigenartig, Ich habe es eben nochmal mit der Oracle-jdk 1.8.111 probiert, ebenso erfolglos.

@NullPointer:
Ach ja, die Meldungen. Die eigentliche Konsole beschwert sich beim Ausführen so:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The return type is incompatible with Object.clone()

	at prakt.v5.Complex.clone(Complex.java:56)
	at prakt.v5.Complex.main(Complex.java:9)

Beim Ersetzen von Complex durch Object verständlicherweise so:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Type mismatch: cannot convert from Object to Complex

	at prakt.v5.Complex.main(Complex.java:9)

Wie handhabe Ich das nun? Ich will ein Complex, kein Object.
 
Du musst Object explizit zu Complex casten.
 
Zurück
Oben