2012-10-20 18 views
5

Eventuali duplicati:
C# vs Java genericsTipo cancellazione: Java vs C#

Java uso Tipo cancellazione mentre C# mastio tipo di informazione in fase di esecuzione, che cosa sono la differenza pratica nei comportamenti di il linguaggio di questo design?

+1

Guardate [qui] (http://stackoverflow.com/questions/355060/c-sharp-vs-java-generics) –

risposta

2

Ecco un esempio di qualcosa che è possibile solo se le informazioni sul tipo è mantenuto in fase di esecuzione:

public string DoSomething<T>() 
{ 
    return typeof(T).Name; 
} 

Il più vicino si potrebbe ottenere in Java è qualcosa di simile:

public <T> string DoSomething(Class<T> theClass) 
{ 
    return theClass.getName(); 
} 
1

Qualcosa che accade in Java a causa della cancellazione dei tipi è la creazione di metodi sintetici chiamati "metodi Bridge".

Ciò accade in genere quando Java tenta di compilare una classe o un'interfaccia che estende una classe parametrizzata o implementa un'interfaccia parametrizzata. In questo caso, potrebbe essere necessario che il compilatore Java crei un metodo sintetico (metodo bridge) come parte del processo di erosione dei tipi, che viene visualizzato nella traccia dello stack.

Il compilatore esegue questa operazione per preservare il polimorfismo dei tipi generici dopo il processo di cancellazione del tipo.

La documentazione di Java ha an example.

4

Ci sono molti problemi con la cancellazione del tipo. Porta indietro brutti ricordi. Non ho usato Java dal 1.6, quindi potrebbe non essere aggiornato, ma alcune cose che ricordo:

  1. Non è possibile creare una nuova T (o fare qualsiasi cosa che richiede sapere quale sia il tipo T in realtà)
  2. liste generiche non possono creare una serie di T
  3. non è possibile utilizzare int, float, ecc in farmaci generici con Java
    1. Questo ha implicazioni di prestazioni e memoria perché si deve sempre utilizzare la versione di heap (Numero intero, ecc.)
  4. Non è possibile implementare un'interfaccia generica con due Ts diversi, ad es. class c implements IComparable<MyClass>, IComparable<MyOtherClass> è impossibile.
    1. Più praticamente, non è possibile sovraccaricare metodi con tipi generici diversi, ad es. prendendo in List<T1>, List<T2> e così via. Ad esempio, Java -- How to deal with type erasure in constructors?
  5. tutto è fatto da casting e la boxe