2017-04-09 1 views
0

Ich habe einige Codes zu überprüfen, SMS-Daten übergeben, und es gibt eine Filterfunktion einen Vektor Guss verwenden, dass jetzt die Kompilierung Warnung verursacht:Wie behebe ich "Ungeprüfte Besetzung" bei Verwendung eines Vektors mit Objekt?

Unchecked cast: 'java.lang.Object' to 'java.util.Vector<xxx.Event>'

an diesem Ort:

values = (Vector<Event>) results.values; 
           ^
required: Vector<Event> 
found: Object 

Das Codefragment ist wie folgt:

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results.count != 0) { 
       values = (Vector<Event>) results.values; 
       notifyDataSetChanged(); 
      } 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence smsType) { 
      FilterResults results = new FilterResults(); 
      Vector<Event> eventList = new Vector<>(); 

      if (smsType.equals("ALL")) { 
       results.values = allEvents; 
       results.count = allEvents.size(); 
       return results; 
      } 
      for (Event event : allEvents) { 
       if (event.getType().toString().equals(smsType)) { 
        eventList.add(event); 
       } 
      } 
      results.values = eventList; 
      results.count = eventList.size(); 
      return results; 
     } 
    }; 
} 

Ich habe bereits um an verschiedenen SO Lösungen gesucht, wie: this, this, this, this, this und this. Aber ich muss zugeben, sie haben nur mehr Verwirrung verursacht.

Zusätzlich gibt es einige Vorschläge, eine ArrayList anstelle einer Vector zu verwenden, aber diese Vektoren haben den Vorteil, synchronized im Gegensatz zu ArrayLists zu sein. Ich habe keine Ahnung, ob das hier von Bedeutung ist.

Und kein, ich will nicht zu @SuppressWarnings, sondern versuchen, das Problem sauber mit Java zu verstehen und zu lösen 8.

+0

möglich duplizieren: http://stackoverflow.com/questions/14642985/type-safety-unchecked-cast-from-object-to-listmyobject –

+0

@VeneetReddy Danke für das Hinzufügen zu der bereits lange Liste der Verwirrung! :) – not2qubit

Antwort

0

java.util.Vector sollte nicht verwendet werden, weil sie für neunzehn obsolescent gewesen Jahre. Es trägt Nicht-Sammelsendungen, die wir nicht brauchen. Verwenden Sie eine synchronisierte oder gleichzeitige Liste, wenn Sie Nebenläufigkeit benötigen. Verbannen Sie Vector (und Hashtable) aus Ihrer Toolbox.

(Vector<Event>) und andere generische Umwandlungen werden immer deaktiviert, da generische Typen nicht verifizierbar sind. Sie benötigen ein Laufzeittyp-Token, ein Objekt vom Typ Class<T>, und verwenden seine cast-Methode, um eine generische Besetzung zu machen, aber es ist wahrscheinlich einfacher, über Ihre "Ich will nicht zu @SuppressWarnings" Bigotterie und verwenden Sie diese Anmerkung richtig, wie dokumentiert in Effektive Java, von Joshua Bloch.

Verwandte Themen