ligação automática (inferência de tipo) de tipos genéricos pelo compilador

o código a seguir tem erro de compilação na linha de T3:

public <E> List<E> getList()
{
    return new ArrayList<E>();
}
public <T> void first()
{
    List<T> ret = new ArrayList<T>();
    List<T> list = getList();
    T t1 = ret.get(0);
    T t2 = list.get(0);
    T t3 = getList().get(0);
}

A mensagem de erro é:Incompatibilidade de tipo: não é possível converter de Objeto em T

Sei que posso corrigir o problema usando a conversão ou encadernação manual, minhas perguntas são:é tão difícil para o compilador fazer a ligação automática; existe um caso em que ele falhará?

Editar: adicionada a mensagem de erro.

Editar: adicionado outro exemplo de como o erro não ocorreu.

Edit: removeu o segundo exemplo por ser confuso, deixou a pergunta mais clara.

questionAnswers(5)

yourAnswerToTheQuestion