2013-01-28 13 views
5

Sto provando a inviare un Collection<myClass> attraverso una rete. L'ho lanciato come oggetto e l'ho inviato in questo modo.cast di oggetto nel tipo originale

Penso che il modo migliore per modellare l'oggetto passato nella rete sia attraverso un oggetto, poiché non so in anticipo cosa potrebbe essere (in questo esempio, è una raccolta, ma altre volte è un Mappa o qualsiasi altra cosa a cui puoi pensare). Questo sarebbe in qualche modo il modo in cui i socket funzionano in C, dove solo il destinatario e il mittente sanno cosa stanno inviando/ricevendo e gettano gli oggetti in modo appropriato, mentre la connessione si preoccupa solo dei byte e li trasmette correttamente.

Tuttavia, quando si riceve l'oggetto, se provo a restituirlo a collection<myObject>, un messaggio di avvertimento indica la trasmissione di tipi non sicuri. Potrei aggiungere @suppressWarnings, ma quale sarebbe il modo migliore per fare questo cast in modo da evitare questo avvertimento?

Grazie

+2

La soluzione corretta è effettivamente '@ SuppressWarnings', se si è certi che il cast è effettivamente sicuro. Qualsiasi altra soluzione sopprimerà l'avviso da qualche altra parte. –

+0

Non mi piace essere legato a strumenti che dovrebbero aiutarmi, ma il fatto è che io uso "sonar", e anche se aggiungo @SuppressWarnings, ricevo comunque un errore nel sonar. C'è un modo per disattivare anche l'avviso sonar? – shkra19

+0

Sei sicuro che l'avviso SONAR abbia lo stesso motivo? Cosa dice l'avvertimento? –

risposta

3

Come si (anche se, per lo più Java) non si conosce il tipo di oggetto che si riceve, è impossibile lanciare tranquillamente.

cosa che puoi fare:

  • Devi essere veramente sicuri che sia l'oggetto che si pensa che è
  • Forse aggiungere un blocco try-catch per catturare ClassCastException (per essere più sicuri)
  • E aggiungere infine l'annotazione @SuppressWarnings, poiché si desidera ignorare i controlli di sicurezza di Java (perché si ritiene di conoscerne meglio)
+0

Inoltre, instanceof. – sdasdadas

+0

@sdasdadas che non funzionerà suppongo, dato che puoi solo creare un'istanza 'Object' quando ricevi i dati. Se pensi di sapere cosa ottieni puoi creare un oggetto di un altro tipo, ma non hai più bisogno di 'instanceof'. – Veger

+0

Avevo l'impressione che cercasse qualcosa del genere: http://stackoverflow.com/questions/2651632/how-to-check-if-an-object-is-a-collection-type-in-java ma forse ho frainteso la domanda. – sdasdadas

1

Prendere in considerazione l'utilizzo di alcuni intervalli formato di pubblicazione per la serializzazione, come JSON o XML. Ci sono un sacco di librerie là fuori per il marshalling e gli oggetti unmarshallling in/da JSON. Ad esempio GSON. Quello che ottieni gratuitamente è l'interoperabilità della lingua, perché d'altra parte del filo ci potrebbe essere un programma in qualsiasi lingua.

+1

+1: compatto, pulito, semplice – amphibient

+0

Non sono contrario all'uso di json o xml (infatti l'ho già fatto in un'altra parte del mio progetto), ma come cambia il fatto che, come programmatore che codifica la rete parte, non conosco il tipo di oggetto trasmesso (noto solo da mittente/destinatario)? Che classe devo usare, se non Object? – shkra19

+0

-1 non affronta la preoccupazione dell'OP, e l'unico effetto sarebbe quello di spostare il cast non sicuro altrove –

Problemi correlati