2012-04-04 7 views
1

hier ist also mein Code:Warum bekomme ich eine ungeprüfte Cast-Warnung für diesen generischen Typ?

public class SetWritable<T extends Writable> implements Writable {  
    private Class<? extends Writable> valueClass; 
    private Set<T> values; 

    public SetWritable(Class<T> valueClass) { 
     this.valueClass = valueClass; 
     this.values = new HashSet<T>(); 
    } 

     public void readFields(DataInput in) throws IOException { 
     values = new HashSet<T>();   
     int len = in.readInt(); 

     for (int i = 0; i < len; i++) {   
      //this line is where I get the warning 
      //FYI, WritableFactories.newInstance returns an instance of Writable 
      T value = (T) WritableFactories.newInstance(valueClass); 

      value.readFields(in);    
      values.add(value); 
     } 
    } 
} 

Was mir verwirrend ist dies: Ich habe behauptet, dass T Beschreibbare erstreckt, also warum bekomme ich eine Warnung, wenn ich versuche, die beschreibbar zu werfen auf T? Und da ich weiß, dass T schreibbar ist, ist es sicher, diese Warnung zu unterdrücken?

Antwort

4

Sie erhalten die Warnung, weil WritableFactories.newInstance eine Writable zurückgibt und Ihre TerstrecktWritable, so dass es könnte kein sicherer gegossen werden. Da Sie jedoch Class<T> als Argument für newInstance verwenden, ist es sicher, diese Warnung zu unterdrücken.

Es könnte besser sein, als valueClassClass<T> zu speichern und Class#cast verwenden für Sie zu werfen, dann werden Sie keine hässlichen @SuppressWarnings über Ihre Methode hängen haben.

+0

Guter Anruf! Und danke für die schnelle Antwort. Ich habe Class.cast noch nicht benutzt, aber ich denke, ich mag es! – sangfroid

+0

@PaulBellora Ich benutze nicht hadoop, aber die [Referenz] (http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/WritableFactories.html#newInstance (Java. lang.Class)) Ich fand gefunden 'Writable'. – Jeffrey

+0

@ Jeffrey - Mein Fehler! Ich übersprang zu schnell und nahm an, dass das OP die Klasse # newInstance benutzte und den Hadoop-Teil komplett vermisste. –

3

Alle T sind Writable, aber nicht alle Writable s sind T s. Also, wenn Sie eine Writable zu T zu werfen, kann es nicht sicher sein, dass die Writable ist eigentlich a T.

Zum Beispiel, stellen Sie sich vor, es gab eine S extends Writable. Die newInstance könnte ein S und nicht ein T, aber es immer noch Writable sein würde - aber es T Gießen würden Sie ein ClassCastException.

+0

Du hast meine Antwort kopiert;) – ControlAltDel

+0

Nein, StackOverflow sagt, dass mein um 22:12:14 gepostet wurde, aber deins wurde 30 Sekunden später um 22:12:44 gepostet. Es ist anders herum. ;) –

+0

Ja, aber ich weiß sicher, dass ich es zuerst dachte :-D – ControlAltDel

1

Alle T-Shirts sind beschreibbar, aber nicht alle Writables sind t

Verwandte Themen