Domanda

Provo a lanciare un oggetto sulla mia classe Action, ma il risultato è un avviso:

Type safety: Unchecked cast from Object to Action<ClientInterface>

Action<ClientInterface> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<ClientInterface>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Grazie per tutto l'aiuto

È stato utile?

Soluzione

Sì - questa è una conseguenza naturale del digitare la cancellazione . Se o è in realtà un esempio di Action<String> che non saranno catturati dal cast -. Si vedrà solo il problema quando si tenta di utilizzarlo, passando in un ClientInterface invece che una stringa

È possibile liberarsi della segnalazione utilizzando:

@SuppressWarnings("unchecked")

come un'annotazione funzione, ma non si può facilmente risolvere il problema di fondo: (

Altri suggerimenti

Come al solito, Jon Skeet ha ragione.

Per approfondire la parte non facile della sua risposta:

Dato

class ClientAction implements Action<ClientInterface> {}

Tu puoi scrivere:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

Ciò elimina sia il cast che l'avviso, al prezzo di introdurre un tipo non generico da poter utilizzare .class per ottenere una digitazione sufficientemente accurata Class oggetto.

I mezzi di avvertimento che il compilatore non può garantire la sicurezza di tipo anche se la fusione funziona bene in fase di esecuzione. A causa della cancellazione, in fase di esecuzione il casting è semplicemente un casting per azione. È possibile che la classe generica sottostante non è di tipo ClientInterface come previsto. In questo caso, il problema apparirà più tardi (forse anche molto più tardi), come ClassCastException.

In questo caso specifico vi consiglio di sopprimere questo avvertimento specifico dal seguente direttiva del compilatore:

@SuppressWarnings("unchecked")

Non si preoccupi per. È perché il compilatore Java non ha modo di sapere, quello che è il vero tipo di oggetto.

Hai perso le informazioni sul tipo a causa della cancellazione (vale a dire, sono stati cancellati i tipi parametrizzati), da cui l'avvertimento. Non si può fare nulla al riguardo, oltre ripulire il codice che circonda in modo che i farmaci generici sono utilizzati più di frequente, in modo da poter passare le informazioni di tipo generico e di evitare di colata a tutti.

Questa è un'abbattuto. E 'il cast dinamico in cui il compilatore non ha alcuna idea dell'oggetto reale il riferimento sta puntando.

Si ottiene questo avviso perché il tipo di destinazione del Action<ClientInterface> cast è un tipo parametrico e il compilatore non può garantire che il tipo di oggetto essendo colato è dello stesso tipo.

Se non si desidera eliminare questo avviso e non si preoccupano il parametro di tipo, è possibile modificare il codice per questo utilizzando i caratteri jolly:

Action<?> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<?>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Questo è molto più sicuro perché la instanceof non può verificare che o è un oggetto di Action<ClientInterface>, semplicemente controllare se o è un oggetto di Action dato ulteriori informazioni di tipo generico sarà Erased in fase di esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top