Unchecked-Warnungen für Arraylist
Warum bin ich immer diese 4 Warnungen aus -Xlint und was sollte ich tun Sie? Ich bin gerade erst in Java, also bin wahrscheinlich etwas fehlt offensichtlich.
import java.util.*;
class CompareGerbils implements Comparator {
public int compare(Object o1, Object o2) {
return ((Gerbil)o2).number() - ((Gerbil)o1).number();
}
}
class Gerbil {
int gerbilNumber;
Gerbil(int gN) {
gerbilNumber = gN;
}
int number() {
return gerbilNumber;
}
}
public class lt {
public static void main(String[] args) {
//I'd like to be able to add both ints and strings to list
ArrayList list = new ArrayList();
//unchecked call warning:
list.add(1);
//unchecked call warning:
list.add("b");
ArrayList<Gerbil> gerbillist = new ArrayList<Gerbil>();
for(int i = 0; i < 5; i++) {
gerbillist.add(new Gerbil(i));
}
//unchecked conversion warning
//unchecked method invocation
Collections.sort(gerbillist, new CompareGerbils());
}
}
EDIT: Antworten bisher beantwortet haben, Arraylist-Deklaration. Wie über die Art der Warnungen an der Unterseite des Codes? Dank
- Jemand anderes antwortete, während ich getippt, aber ich würde gerne eine Stil-note. Ihre Komparator impl benannt ist falsch und sollte mit einem Großbuchstaben beginnen. Nicht in dem Sinne zu sein, pedantisch, aber du wirst verrückt irgendwann die Aufrechterhaltung dieser code Fragen, warum das argument Typ für eine variable, Erklärung scheint zu sein, eine variable.
- Bitte seien Sie pedantisch. Wie ich schon erwähnt habe, ich bin nur zu lernen. Ich werde die änderung vornehmen.
// I'd like to be able to add both ints and strings to list
- Das ist in der Regel ein Designfehler. Warum sind Sie versuchen, erstellen Sie eine Sammlung mit grundlegend verschiedenen Arten der Dinge?- die Art Warnung, weil Sie definiert haben, der Komparator keine Daten geben, d.h.
new Comparator()
stattnew Comparator<Gerbil>()
. Ich habe aktualisiert, meine Antwort entsprechend den richtigen Gebrauch. - Peters: ich bin nur zu lernen, im moment. Alle Beispiele, die ich gesehen habe Stimmen, um eine einzige Art, so dass ich wollte sehen, ob die Sprache hatte diese Flexibilität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie bekommen das, weil Sie nicht definiert haben, einen Datentyp für die
ArrayList list
. Der einzige Weg, um beide Zeichenfolgen und Ganzzahlen inlist
ohne Warnungen ist definiert alsArrayList<Object> list
- das ist das, was hier geschieht implizit (Linielist.add(1);
implizite Konvertierung1
zunew Integer(1)
- das nennt man autoboxing). Beachten Sie auch, dass, wenn Sie wollen, um beide Zeichenfolgen und Ganzzahlen inlists
, die Sortier-Methode nicht wirklich sinnvoll - wie werden Sie erwarten, dass alles sortiert man alphabetisch oder numerisch?Edit: Außerdem, es wird nicht als gute Praxis zu erklären, einen konkreten Typ (d.h.
ArrayList<Object> list
), es sei denn, Sie haben sehr gute Gründe, dies zu tun. Es wird empfohlen, dass Sie die Initialisierung mit Hilfe einer Schnittstelle, d.h.List<Object> list
.So, würde der code so sein (Hinweis: das Teil
Comparator<Gerbil>
die behebt die Warnung inCollections.sort
):Bezug auf die Wüstenrennmaus Klasse, ich schlage vor, Sie verwenden das Formular
getNumber
als den Namen einer Methode anstattnumber
- es ist ein de-facto-standard für die Methoden-Namen zum abrufen des Werts einer member-variable (bzw.setNumber(int value)
für Einstellung):getNumber
eher alsnumber
bei der Programmierung in Java.Die Warnung tritt auf, wenn Sie eine nicht-generischen Typs in einem Kontext, in dem eine generische erwartet. Das kompilieren ist zu sagen, Sie könnten Recht haben, aber ich kann nicht überprüfen Sie den Typ für Sie.
Sie cna entweder;
EDIT: In diesem Beispiel, müssen Sie wählen Sie eine super-Klasse/interface der Elemente in der Liste.
Anstelle von Objekt, das Sie auswählen könnte
Seralizable
oderComparable
jedoch eneither wahrscheinlich ist, nützlich zu sein. In der Tat einList<Object>
ist selten sinnvoll, außer in den übungen.Den richtigen Weg zur Umsetzung der
Comparator
ist nutzen-Vergleich. Mit-
ist nur gültig, wenn Sie wissen das vielleicht nicht überlaufen. z.B. 2000000000 - -2000000000 < 0 in der Erwägung, dass Sie vielleicht erwarten 2000000000 - -2000000000 > 0Für Testzwecke ich schlage vor, versucht zu Sortieren, eine Liste, die nicht sortiert sind. Ein einfacher Weg, dies zu tun ist, verwenden Sie die shuffle() Methode. Dies könnte noch sortiert werden, aber die große der Liste, desto weniger wahrscheinlich ist der Fall.
müssen Sie wissen, Generika http://download.oracle.com/javase/1.5.0/docs/guide/language/generics.html
die Sie hinzufügen möchten
primitive
und eine Zeichenfolge inarraylist
.entweder u tun, etwas zu nehmen
oder wenn Sie möchten, dass nur strings