Problem mit Generics und Comparable

emre.hasan

Mitglied
Hallo Leute,

Ich muss was für die Uni proggen, ne Hausaufgabenhilfe will ich nicht, aber ich habe ein Fehler
mit meinem Comparable. Ich sitze mehr als 2 Tage dran und hab schon Brute-Force mäßig alles ausprobiert. Es will nicht. In den Tutorials von Oracle finde ich auch nichts passendes dazu. Hier mal mein Code von allen Klassen die verwendet werden.

Das Interface darf ich nicht ändern!
Java:
public interface PriorityQueue<E extends Comparable<E>> {
	E findMin() throws PREmptyException;
	E deleteMin() throws PREmptyException;
	void insert(E element) throws PQFullException;
	boolean isEmpty();
	int size();
}

Java:
public class PQNode<E extends Comparable<E>> implements Comparable<E> {
	private E value;
	PQNode<E> prev,next;
	
	public PQNode(E value, PQNode<E> prev, PQNode<E> next){
		this.value = value;
		this.prev = prev;
		this.next = next;
	}
	
	public E getValue(){
		return value;
	}

//	public int compareTo(PQNode<E> o) {
//		return getValue().compareTo(o.getValue());
//	}
	
	public PQNode<E> getPrev(){
		return prev;
	}
	
	public PQNode<E> getNext(){
		return next;
	}
	
	public void setNext(PQNode<E> next){
		this.next = next;
	}
	
	public void setPrev(PQNode<E> prev){
		this.prev = prev;
	}

	@Override
	public int compareTo(E o) {
		return getValue().compareTo(o);
	}
}
Java:
public class unsorted_linkedlist<E extends Comparable<E>> implements PriorityQueue<E> {

	PQNode<E> tail,head,current;
	static int counter = 0;
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public unsorted_linkedlist(){
		head = new PQNode(null,null,tail);
		tail = new PQNode(null,head,null);
		current = head;
	}
	public E findMin() throws PREmptyException {
		PQNode<E> temp = null;
		if(head.getNext() != null){ current = head.getNext(); temp = head.getNext(); }
		while(temp.getNext() != null)
		{
			temp = temp.getNext();
			if(current.compareTo(temp.getValue()) < 0)
				current = temp;
		}
		return current.getValue();
	}

	public E deleteMin() throws PREmptyException {
		E returnTemp = findMin();
		PQNode<E> temp = current;
		current.getPrev().setNext(current.getNext());
		current.getNext().setPrev(temp.getPrev());
		return returnTemp;
	}

	public void insert(E element) throws PQFullException {
		PQNode<E> temp = new PQNode<E>(element,tail.getPrev(),tail);
		tail.getPrev().setNext(temp);
		tail.setPrev(temp);
		counter++;
	}

	public boolean isEmpty() {
		return (counter == 0);
	}

	public int size() {
		return counter;
	}

Hier entsteht eigentlich auch der Fehler, den gebe ich nachdem Code
explizit nochmal an:

Java:
public class test {
	public static void main(String[] args) {
		unsorted_linkedlist<String> test = new unsorted_linkedlist<String>(); 
		test.insert("Hallo");
		test.insert("Element");
		System.out.println(test.deleteMin());
	}
}

Hier der Fehler:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Bound mismatch: The type String is not a valid substitute for the bounded parameter <E extends Comparable<E>> of the type PQNode<E>
Bound mismatch: The type String is not a valid substitute for the bounded parameter <E extends Comparable<E>> of the type PQNode<E>
The method insert(PQNode<String>) in the type unsorted_linkedlist<PQNode<String>> is not applicable for the arguments (String)
The method insert(PQNode<String>) in the type unsorted_linkedlist<PQNode<String>> is not applicable for the arguments (String)

at Aufgabe_3.test.main(test.java:5)

Ich hoffe jemand kann mir da behilflich sein
 
wuerd ich gern... aber der code kompiliert bei mir in eclipse mit java 1.6.0

gibts zwar dann nen NPE beim compareTo weil head/tail elemente mit null sind... aber kompiliert
 
Hää?

Ich hab grad nachgeschaut, mein Eclipse unter Mac benutzt auch 1.6 beim kompilieren.
-.- . Sowas macht einen fertig ...

gibt er bei Syso() was aus?
 
>gibt er bei Syso() was aus?

Es wird beim insert eine NPE fliegen.
PQNode<E> temp = new PQNode<E>(element, tail.getPrev(), tail);

tail ist null....

EDIT:
ne sorry..hätte alle kopieren sollen....beim compareTo fliegt sie... (wie bygones schon erwähnt hat)

EDIT2:
Was soll übrigens der static counter? Zählen wieviele Elemente in allen je erstellten Listen sind.
 
Zuletzt bearbeitet:
Bin mir eigentlich sicher das das klappt, da tail als Value = null ist, aber an sich ist tail ja ein Objekt von PQNode, dass im Konstruktor von unsorted_list schon gesetzt wird.

Damit dürfte das Element nicht auf ein Leeres zeigen, sondern eines mit fester Adresse, aber 'leerem Inhalt'.

In einem anderen Projekt hatte das nämlich genauso geklappt nur das <E extends Comparable<E>> macht mir Kopfschmerzen. Warum ist es nicht erlaubt ein String in der Testklasse explizit anzugeben???
 
>Bin mir eigentlich sicher das das klappt,

Ja. war mein Fehler, hab nur die "wichtigen" Code-Stellen kopiert...eben sie fliegt erst beim compareTo

>ein String in der Testklasse explizit anzugeben???

Klappt wunderbar:
Java:
public interface PriorityQueue<E extends Comparable<? super E>> {}

class unsorted_linkedlist<E extends Comparable<? super E>> implements PriorityQueue<E> {
	void foo(E e) {
		System.out.print(e);
		System.out.println("I am a " + e.getClass());
	}
}

class XXX {
	public static void main(String... _) {
		unsorted_linkedlist<String> s = new unsorted_linkedlist<String>();
		s.foo("foobar");
		s.foo("blub");
		unsorted_linkedlist<Integer> si = new unsorted_linkedlist<Integer>();
		si.foo(Integer.valueOf(0));
		si.foo(Integer.valueOf(2));
	}
}
 
Ja wollte mir das Leben etwas einfacher machen, anstatt durch die ganze Liste durchzurasseln und alles von head bis tail durchzuzählen. Aber mach ich noch...
Sollte ja sein

int tempCounter = 0;
if(!isEmpty()){
PQNode temp = head;
while(temp.getNext() != tail){
temp = temp.getNext();
counter++
}
}

return tempCounter. Dann wäre es auch nciht static sondern würde sich nur auf die aktuelle Liste beziehen. Wäre schon schlauer ich weiß ^^
 
was ist der unterschied zwischen <E extends Comparable<E>> und <E extends Comparable<? super E>>?

I.wie kam der gleiche Fehler ... -.-, auch obwohl ich alles du <E ... ? super E> ersetzt hatte.
In den Klassen selber kein Problem, in der main substitution ist nicht möglich....

Sollt ich vllt mal an ein anderen PC ran? Aber das dürfte doch nicht sein oder?

EDIT: Ich muss das mal jetzt austesten, ich geh mal zum Fachbereich und lad meine Daten mal hoch und kompiliere... und schreibe dann hier rein, ob es dann doch an meinem Mac-Java liegt...
 
Zuletzt bearbeitet:
nein dürfte nicht... und ich habe in meinem code auch kein [c]<E extends Comparable<? super E>>[/c] - das ? super heißt "nicht nur E sondern auch eine Oberklasse von E"
 
>und ich habe in meinem code auch kein

War ich..macht der Gewohnheit....

>Sollt ich vllt mal an ein anderen PC ran? Aber das dürfte doch nicht sein oder?

Erst mal Rahmenbedigungen testen.
OS / compiler / IDE

EDIT:
Habs mal mit dem Sun 1.6 von der Shell probiert und klappt. (eclipse hat da teils andere vorstellungen ;-)
 
Zuletzt bearbeitet:
Ich bin etwas verwirrt vom Original-Code:

Java:
public class PQNode<E extends Comparable<E>> implements Comparable<E> {...
Damit sagst du, ein PQNode soll mit einem E verglichen werden können. Wäre es nicht sinnvoller, wenn die PQNodes untereinander vergleichbar wären? Also:
Java:
public class PQNode<E extends Comparable<E>> implements Comparable<PQNode<E>> {...
 
Ja so seh ich das auch. Das war auch so, bis ich halt verzweifelt war und über Brute-Force alle möglichen <Inhalte> durch alles mögliche ersetzt habe um i.wann ein positives ergebnis zu bekommen.

Ne aber an sich war das so. das sieht man auch im original code, und zwar dort wo das eine compareTo(){
} auskommentiert ist...

Ich habs jetzt am Linux PC mit nem ganz normalen Java-Compiler gemacht.... Der Fehler will nicht weg


hasan@guangzhou:~/Desktop$ javac *.java
test.java:5: type parameter java.lang.String is not within its bound
unsorted_linkedlist<String> test = new unsorted_linkedlist<String>();
^
test.java:5: type parameter java.lang.String is not within its bound
unsorted_linkedlist<String> test = new unsorted_linkedlist<String>();
^
2 errors


Sollte ich vielleicht nochmal den ganzen Code hier hochladen?

Danke erstmal an alle, die soviel Geduld mit mir und meinem Problem haben.
 
Ich habs jetzt am Linux PC mit nem ganz normalen Java-Compiler gemacht.... Der Fehler will nicht weg


hasan@guangzhou:~/Desktop$ javac *.java
test.java:5: type parameter java.lang.String is not within its bound
unsorted_linkedlist<String> test = new unsorted_linkedlist<String>();
^
test.java:5: type parameter java.lang.String is not within its bound
unsorted_linkedlist<String> test = new unsorted_linkedlist<String>();
^
2 errors

Ein String ist ja auch keine PQNode? Poste mal allen Code
 
Ok hier

Java:
public class test {
	public static void main(String[] args) {
		unsorted_linkedlist<String> test = new unsorted_linkedlist<String>(); 
		test.insert("Hallo");
		test.insert("Element");
		System.out.println(test.deleteMin());
	}
}

Einzelne Dateien, aber zusammengefasst hier
Java:
public class PREmptyException extends Exception {
	public PREmptyException(){
		super("PRQueue ist leer");
	}
}

public class PQFullException extends Exception {
	public PQFullException(){
		super("PRQueue ist voll!");
	}
}

public interface Comparable<E> {
		public int compareTo(E o);
}

Java:
public interface PriorityQueue<E extends Comparable<E>> {
	E findMin() throws PREmptyException;
	E deleteMin() throws PREmptyException;
	void insert(E element) throws PQFullException;
	boolean isEmpty();
	int size();
}

Java:
public class unsorted_linkedlist<E extends Comparable<E>> implements PriorityQueue<E> {

	PQNode<E> tail,head,current;
	static int counter = 0;
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public unsorted_linkedlist(){
		head = new PQNode(null,null,tail);
		tail = new PQNode(null,head,null);
		current = head;
	}
	public E findMin() throws PREmptyException {
		PQNode<E> temp = null;
		if(isEmpty())
			throw new PREmptyException();
		if(head.getNext() != null){ current = head.getNext(); temp = head.getNext(); }
		while(temp.getNext() != null)
		{
			temp = temp.getNext();
			if(current.compareTo(temp) < 0)
				current = temp;
		}
		return current.getValue();
	}

	public E deleteMin() throws PREmptyException {
		if(!isEmpty()){
			E returnTemp = findMin();
			PQNode<E> temp = current;
			current.getPrev().setNext(current.getNext());
			current.getNext().setPrev(temp.getPrev());
			return returnTemp;
		}
		else
			throw new PREmptyException();
	}

	public void insert(E element) throws PQFullException {
		PQNode<E> temp = new PQNode<E>(element,tail.getPrev(),tail);
		tail.getPrev().setNext(temp);
		tail.setPrev(temp);
	}

	public boolean isEmpty() {
		return (head.getNext() == tail) ? true : false;
	}

	public int size(){
		int tempCounter = 0;
		if(!isEmpty()){
			PQNode temp = head;
			while(temp.getNext() != tail){
				temp = temp.getNext();
				tempCounter++;
			}
		}
		return tempCounter;
	}

	
}

Java:
public class PQNode<E extends Comparable<E>> implements Comparable<PQNode<E>> { //PQNODE rausl�schen??
	private E value;
	PQNode<E> prev,next;
	
	public PQNode(E value, PQNode<E> prev, PQNode<E> next){
		this.value = value;
		this.prev = prev;
		this.next = next;
	}
	
	public E getValue(){
		return value;
	}

	public int compareTo(PQNode<E> o) {
		return getValue().compareTo(o.getValue());
	}
	
	public PQNode<E> getPrev(){
		return prev;
	}
	
	public PQNode<E> getNext(){
		return next;
	}
	
	public void setNext(PQNode<E> next){
		this.next = next;
	}
	
	public void setPrev(PQNode<E> prev){
		this.prev = prev;
	}

//	@Override
//	public int compareTo(E o) {
//		return getValue().compareTo(o);
//	}
}
 
fange bitte parallel in einem anderen Projekt komplett von vorne an, beginne mit

Java:
public class Test
{
    public static void main(String[] args)
    {
        UnsortedLinkedlist<String> test = new UnsortedLinkedlist<String>();
        System.out.println("Ende");
    }
}


class UnsortedLinkedlist<T>
{
}
(auch gleich mal richtige Klassennamen..)
funktioniert das?
jetzt nach und nach Teile des Originalcodes ergänzen/ kopieren, den generischen Parameter komplizierter machen,
die Node-Klasse dazu usw., zur Sicherheit nirgendwo E verwenden, sondern einen der anderen Buchstabeben..

wenn es irgendwann nicht mehr geht dann auch einen Schritt zurücknehmen und testen ob es dann wieder geht,

bei deinen Fehlermeldungen habe ich irgendwie das Gefühl, dass sie sich auf andere Klassen beziehen.., besonders ganz am Anfang
> The method insert(PQNode<String>) in the type unsorted_linkedlist<PQNode<String>> is not applicable for the arguments (String)
 
Ich habs versucht. Schritt für Schritt einzeln abzutippen. Klassennamen alles groß etc...

Mein PQNode<E> muss doch generisch sein, damit ich Inhalte vom Typ E reinspeichern kann.
Dann hab ich doch auch bei PQNode<E> Comparable implementiert das es auch mit sich identischen Objekten vergleichbar ist.

Dann habe ich mein Unsorted_LinkedList<E extends Comparable<E>> das ja auch generisch sein muss, weil ich vom Typ E dann noch PQNodes mit dem gleichen Typen erstelle, und desweitern müssten die auch comparable sein, weil ich das interface PriorityQueue<E> implementiere. Das klappt doch alles super schön.

Ich hab es jetzt auf drei PC's mit java 1.6.0 getestet. Der will nirgends und immer der gleiche Fehler bei der Test-Klasse...

Ich bedanke mich bei allen für die Hilfsversuche. Ich denke mal das Thema ist abgeschlossen, weil der Fehler bei meinen verwendeten PC's/Eclipse-Versionen oder ähnlichem liegt anscheinend.

Schönen Abend noch
 
So Problem gelost für die die es interessiert.
Ich hatte meine eigenes Compare Interface und dann gab es namenskollisionen mit dem originalen also einfach mein Interface Loeschen oder nicht hinzufügen und dann lauft das ganze Erst einmal
 

Zurück
Oben