2017-03-14 1 views
0

Ich habe eine Klasse wie folgt definiert:Generics nicht finden können, Symbol

static class ParallelMergeSort<T extends Comparable<Pair>> extends RecursiveAction 

Wo Pair eine Klasse getSecond() oben mit einem Verfahren definiert.

private boolean isLess(T a, T b) { 
    if (a instanceof Pair<?,?>) return a.getSecond().compareTo(b.getSecond()) < 0; 
    return a.compareTo(b) < 0; 
    } 

obwohl ich, dass T von Pair eine Instanz wird bin Überprüfung Auch der Compiler noch mit dem Fehler kommt cannot find symbol:

In der Mergesort Klasse habe ich ein Verfahren, wie definiert

return a.getSecond().compareTo(b.getSecond()) < 0; 
           ^

Was sollte ich ändern, um dieses Problem zu beheben?

+2

@ downvoters Verstand, einen Kommentar zu hinterlassen, was mit der Frage falsch ist? Ich bin nur neugierig –

+0

Zeigt der Caret wirklich auf 'getSecond' von' b'? – mkl

+0

@mkl nein Entschuldigung mein Schlechter, es fügte einen zusätzlichen Raum hinzu, als ich es in –

Antwort

4

Wenn Sie die Prüfung tun:

if (a instanceof Pair) 

dann sollten Sie a und b-Pair gegossen und dann tun den Vergleich:

if (a instanceof Pair && b instanceof Pair) { 
    Pair<?, ?> cast_a = (Pair) a; 
    Pair<?, ?> cast_b = (Pair) b; 
    return cast_a.getSecond().compareTo(cast_b.getSecond()) < 0; 
} 

Derzeit schlägt der Compiler zu kompilieren, weil T konnte möglicherweise ein anderer Untertyp von Comparable<Pair>, und da der Compiler keinen Beweis hat, dass T wird genau Pair sein dann verbietet es die Kompilierung.

einige Noten auf Ihrem Code:

  • der rechte Operand des instanceof Operator nur roh sein sollte. Die generische Angabe (wie Pair<?, ?>) macht keinen Sinn, da diese Überprüfung zur Laufzeit erfolgt, wenn die generische Information gelöscht wird.
  • Ich bin mir nicht sicher, ob dein Design gut ist, also solltest du es zumindest überdenken. Die Verwendung von instanceof ist ein Zeichen für schlechtes Design.
+0

einfügte Danke, ich habe über Löschung in Java vergessen, als ich das schrieb. Auch ja das ist ein ziemlich skizzenhaftes Design, ich könnte die Funktion überladen und die Generika loswerden, aber dies würde in mehr als 4 Kopien derselben Funktion resultieren. –

Verwandte Themen