Sobre instanceof

Outra duvida,
quando se usa “intanceof” em um metodo equals como esse:

public boolean equals( Object o ) { if ( ! ( o instaceof AlgumTipo ) ) { return false; } return ( resultado da comparação dos objetos do mesmo tipo );

não estamos fazendo um atentado contra os bons padroes de orientação a objeto? Não teria com fazer isso generico usando polimorfismo, ou talvez usando reflexão ( que eu não sei se é muito aconselhavel )?
Minha principal duvida eh a seguinte: em que situações eu devo realmente usar intanceof?

Obrigado.

Quando você quiser verificar se uma classe intancia outra e não se ela é igual a outra, por exemplo:

public class Car {
    public Car( String marca ) {

    }
}

public class Test {
    public static void main( String[] args ) {
        Object ferrari = new Car( "ferrari" );
        if ( ferrari instanceof Car ) {

        }
    }
}

Então, você tem que usar o instanceOf pq o método recebe um Object, e se não for uma instancia da classe que você espera vc já retorna false

E você não pode alterar a assinatura do método pq senão vc não estaria sobrescrevendo o metodo equals da classe pai Object

é interessante quando você tem um array de objetos como um ArrayList ou Vector que aceita qualquer tipo de objeto dentro dele. Nesse caso é conveniente testar cada elemento do array para saber o seu tipo antes de um objeto fazer referência a ele.

Exemplo:

Produto produto = new Produto();
Pedido pedido = null;

ArrayList lista = new ArrayList();
lista.add(produto);

pedido = (Pedido) lista.get(0); 
// ERRO, pois um objeto do tipo Produto não pode ser convertido para Pedido