En Java, al ser ArrayList <?> la misma clase que ArrayList no genérica [ver nota al pie aquí], es posible hacer casting entre ambas. Por ejemplo:
ArrayList <string> listaStrings = new ArrayList <string> ();
ArrayList listaNoGenerica = (ArrayList) listaStrings;
Esto, en la CLI, al ser las clases genérica y no genérica distintas, esto no funciona.
Hace algunas semanas, hice una clase genérica abstracta (MiTipo<T>) que tenía algunos métodos como object GetObjectValue () o int CalculateSize (), dos métodos no genéricos. En primer lugar, no puedo tener una lista genérica que incluya dos tipos que hereden de MiTipo <T>. Por ejemplo, este código no va a funcionar:
List <MiTipo> lista = new List <MiTipo>
A menos que tengamos un tipo no genérico MiTipo. Entonces, ¿qué pasa si necesito hacer una lista sin saber qué imeplementaciones de MiTipo voy a agregar? ¿Estoy obligado a usar un ArrayList no genérico?. La única solución posible fue crear una interfaz (no genérica) que tuviera los métodos de MiTipo que no tienen firma genérica. Por ejemplo:
public interface IMiTipo
{
int CalculateSize ();
object GetObjectValue ();
}
Y luego crear una lista:
List <IMiTipo> lista = new List <IMiTipo> ();
Y es posible también recorrerla y ejecutar estos métodos:
foreach (IMiTipo implementacion in lista)
{
Console.WriteLine (implementacion.CalculateSize ());
Console.WriteLine (implementacion.GetObjectValue ())
}
Sería bueno tener una forma de utilizar los métodos o propiedades no genéricas directamente, sin crear la interfaz. Pero es un pequeño costo que podemos asumir ;-)