Srs(a),
Como posso saber, em tempo de execução, o tipo de um Object e dar um cast para o tipo?
Class clazz = o.getClass();
??? tipo = clazz.cast(o);
Grato,
Srs(a),
Como posso saber, em tempo de execução, o tipo de um Object e dar um cast para o tipo?
Class clazz = o.getClass();
??? tipo = clazz.cast(o);
Grato,
cara, se não me engano existe o um método chamado instanceof(); não tenho certeza se é disso que você ta falando. da uma procurada sobre ele ai.
Onde exatamente você está pensando em utilizar isso?
Se não sabe o tipo em tempo de compilação (pra poder dar cast), da mesma forma não vai poder invocar os métodos do objeto.
Se invocar os métodos de forma dinâmica (com reflection), não vai precisar do cast.
Dá um exemplo de como pretende utilizar isso, que talvez possamos te fornecer uma abordagem melhor.
Tbm fiquei pensando o que vc quer fazer.
Veja se o trecho abaixo resolve seu problema.
if ( o instanceof SuaClasse ) {
SuaClasse c = ( SuaClasse ) o;
}
[]'s
Um exemplo um pouco mais completo:
[code]/**
*
@author David Buzatto
*/
public class Teste {
/**
public void testar() {
Object[] os = { new A(), new B(), new C() };
for ( Object o : os ) {
if ( o instanceof A ) {
A a = ( A ) o;
// ou
//A a = A.class.cast( o );
a.a();
}
}
}
private class A {
private void a() {
System.out.println( “a” );
}
}
private class B {
private void b() {
System.out.println( “b” );
}
}
private class C {
private void c() {
System.out.println( “c” );
}
}
}[/code]
Tenho algumas classes Enum implementando uma interface.
Assim uso o polimorfismo para chamar os metodos.
Porém, agora, preciso utilizar o compareTo do Enum e ele é um objeto interface. Não tem o metodo compareTo().
public interface configurador {
public void configurar();
}
public enum Tipos1 implements configurador {
A, B, C, D;
public void configurar(){...}
}
public enum Tipos2 implements configurador {
W, X, Y, Z;
public void configurar(){...}
}
Objeto:
public class Objeto {
private configurador conf;
}
main()
for (Objeto o : objetos) {
Configurador conf = o.getConfigurador();
conf.configurar();
/////////////////////////////
// agora preciso comparar os enums com de outro Objeto
}
não sei como
Pensei em usar um int nos enum A(1), B(2) etc e comparar o getNumero().
Mas gostaria de usar o compareTo() do enum que já existe.
Não sei se fui claro.
davidbuzatto :
Acho q resolveria, porem o codigo iria ficar com muitos if/else.
Mas vc quer comparar enums to mesmo tipo ou de tipos diferentes?
Simples, faça com que sua classe configurador extenda Comparable:
public interface configurador extends Comparable{
}
A comparação será entre tipos iguais. Porem vou comparar todos.
Assim terei q implementar o metodo compareTo em todas as classes q implementarem a interface?
Sim, pois pelo que entendi vc quer comparar enums que implementam a interface configurador. Dessa forma vc poderá garantir que eles sempre serão comparáveis. Interfaces são como contratos… implemente o comparaTo de forma que os enum se organizem da forma q vc deseja.
Mas enums são comparáveis não são?
Vc não precisa implementar Comparable ou estender Comparator.
Já ía esquecendo, se alguma classe implementar configurador e vc não quiser quebrar a cabeça com algo que necessariamente não precise ser ordenado dê um return 0 dentro do comparaTo.
Acredito que sim, mas pelo que entendi, ele utiliza o polimorfismo para utilizar o enum, ou seja, ele não invoca diretamente o Enum, pelo que entendi ele invoca configurador… Como configurador precisa ser ordenado, ele precisa estender comparable nessa classe. Acredito que uma solução mais elegante, seria criar uma classe específica para ordenar o configurador, como uma class que implementasse Comparator. Dessa forma não será necessário implementar compareTo em classes que utilizem o configurador e vc não deseja implementar esse método.
A questão é: meu objeto possui um atributo que pode ser de um tipo contido em um escopo de tipos constantes. Por isso escolhi usar enum.
ex: tipo1 -> a, b, c
tipo2 -> X, Y, Z
Em que cada um, por ex, o Y possui metodos proprios. Caracteristicas proprias. Então aqui usei a interface e o polimorfismo.
Porem, em um mesmo arrayList não posso ter atributos do mesmo escopo(tipo1).
Então eu usaria o compareTo para deixar sempre o atributo(enum) que estiver primeiro na lista de Enum. E remover os outros.
Olhando o codigo talvez agora vcs entendam.
Desculpe, não entendi nada. Vc quer que cada elemento do seu enum tenha métodos próprios ?(pelo que sei eles tem os métodos declarados no próprio enum, claro cada um podendo ter um valor de retorno diferente conforme vc inicializa os elementos do seu enum). Se for para ordená-los, é desnecessário, pois eles aparecerão na ordem em que foram inseridos, então já coloque-os na ordem desejada ou implemente uma das formas de comparação… Ou talvez a ficha tenha me caído agora e a comparação que vc quer fazer seria o equivalente do método equals de um objeto comum.
Não vou conseguir explicar.
Agradeço a ajuda de vcs!