2013-11-28 8 views
19

Hier ist ein Teil eines Programms, das eine ArrayList von einem Server an einen Client sendet. Ich mag die Warnung über die letzte Zeile in diesem Code entfernen:Typ Sicherheit: Ungeprüfte Umwandlung von Objekt zu ArrayList

Client-Code:

Socket s; 
(...) 
// A server is sending a list from the other side of the link. 
ois = new ObjectInputStream(s.getInputStream()); 
MyList = (ArrayList<MyVariable>) ois.readObject(); 

MyVariable eine Java-Klasse mit einigen Attributen ist. Der Server erstellt eine ArrayList und füllt sie mit MyVariable-Variablen als Elemente. Dann sendet es die vollständige Liste an den Client.

Ich möchte wissen, warum ich dort eine Warnung habe und wie man perfekt codiert, um 0 Warnungen zu haben. Wenn es möglich ist, möchte ich vermeiden, "@SuppressWarnings (" unchecked ")" "zu verwenden. ;)

Danke,

Luis

+1

Senden Sie ein Array über den Socket statt einer Collection. '(MyVariable []) ois.readObject()' ist ein sicherer Cast. Um eine Collection in ein typisiertes Array zu konvertieren, verwenden Sie 'list.toArray (new MyVariable [0])'. Um ein Array in eine Collection zu konvertieren, verwenden Sie die Methode 'Arrays.asList'. – VGR

Antwort

11

Es ist unmöglich, diese Warnung zu vermeiden. readObject() gibt ein Objekt zurück. Sie müssen es umsetzen. Und Casting zu einem generischen Typ wird immer eine solche Warnung generieren.

Wenn Sie Ihren Code so sauber wie möglich machen möchten, was eine gute Idee ist, sollten Sie die Java-Namenskonventionen beachten und Variablennamen mit einem Kleinbuchstaben beginnen.

+0

Ich bin mir ziemlich sicher, dass du es kannst. Verpasst meine Antwort irgendetwas? –

+2

Es gibt keine "Liste " zurück und ist übertrieben. Das OP sollte wissen, dass eine "Liste " gesendet wird. –

15

Versuchen Sie, diese

Object obj = ois.readObject(); 
// Check it's an ArrayList 
if (obj instanceof ArrayList<?>) { 
    // Get the List. 
    ArrayList<?> al = (ArrayList<?>) obj; 
    if (al.size() > 0) { 
    // Iterate. 
    for (int i = 0; i < al.size(); i++) { 
     // Still not enough for a type. 
     Object o = al.get(i); 
     if (o instanceof MyVariable) { 
     // Here we go! 
     MyVariable v = (MyVariable) o; 
     // use v. 
     } 
    } 
    } 
} 
2

Ich mag das nicht, aber Sie können einen Behälter (Art eines Alias ​​oder typedef) haben:

// add "implements Serializable" in your case 
private static class MyVariableList { 
    public List<MyVariable> value; 
} 

Und statt mit MyVariableList arbeiten. Auf diese Weise stellen Sie dem Compiler explizit genug Informationen zur Verfügung, um in Runtime Typprüfungen durchführen zu können.