Uma das mudanças do Tiger que eu não coloquei nos slides da minha palestra no BrasilOne é o suporte a covariância. O que é isso?
Basicamente, no escopo do Tiger, isso se refere ao fato de um método poder sobrescrever outro retornando uma subclasse do tipo de retorno do método original. Algo assim:
public interface Product {
//...
}
public abstract class Factory {
public abstract Product create();
//...
}
public class ConcreteProduct implements Product {
//...
}
public class ConcreteFactory extends Factory {
public ConcreteProduct create() {
//...
}
//...
}
O exemplo de covariância é o método create(). A “graça” de ter covariância é que você elimina os casts quando está acessando o tipo concreto diretamente, o que seria muito bom pra quando você tem uma família de interfaces sendo implementadas todas juntas por um conjunto de classes concretas que são dependentes entre si. O código fica muito mais “limpo” do que é hoje.