Java Generics

13 respostas
J
public interface W {
}
//
public interface Wc {
	<T extends W> T tipo(Class<T> wcTipo);
}
//
public interface WcA extends W {
	<T extends W> T operacao(Class<T> wcaOperacao);
}
//
public interface WcB extends W {
	<T extends W> T operacao(Class<T> wcbOperacao);
}
//
public class WcTipo {
	public static Class<? extends WcA> wca() {
		return WcA.class;
	}
	public static Class<? extends WcB> wcb() {
		return WcB.class;
	}	
}
//
public interface WcAX {
	void x();
}
//
public interface WcAA<T> extends W {
	<T extends W> T wcaa();
}
//
public class WcAOperacao<WcAX> {
	public static Class<? extends WcAA> wcaa() {
		return WcAA.class;
	}
}
//
public interface WcBY {
	void y();
}
//
public interface WcBB<T> extends W {
	<T extends W> T wcbb();
}
//
public class WcBOperacao<WcBY> {
	public static Class<? extends WcBB> wcbb() {
		return WcBB.class;
	}	
}
/*Queria acessar desta forma meu objeto*/
public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Wc wc = null;
		wc.tipo(WcTipo.wca()).operacao(WcAOperacao.wcaa()).wcaa();//Ate aqui vai
		wc.tipo(WcTipo.wca()).operacao(WcAOperacao.wcaa()).wcaa().x();//Quero chegar ate aqui
	}
}

Alguem poderia me ajudar

Obrigado !!!
JVDS

13 Respostas

nel

Oi!

Eu só queria entender como tu não está tendo um NullPointerException ai :slight_smile:
E qual o motivo dessa aplicação toda ?

Abraços.

J

nel:
Oi!

Eu só queria entender como tu não está tendo um NullPointerException ai :slight_smile:
E qual o motivo dessa aplicação toda ?

Abraços.

Quero acessar o metodo x() como no exemplo abaixo esqueca o NullPointerException

//Ter acesso ao metodo x() que esta em WcAX
wc.tipo(WcTipo.wca()).operacao(WcAOperacao.wcaa()).wcaa().x()

Estou desenvolvendo aqui um objeto que vai me ajudar e muito o que pretendo fazer com a NF-e.

Obrigado !!!
JVDS

nel

Não vi uma classe que implementa sua interface e que faça com que tenha acesso ao método X.
Você pode ter acesso somente ao método em questão, de qualquer forma, precisas da classe que a implemente.

Posso ter visto com pressa, mas não vi nenhuma classe que extenda a interface WcAX, que é a interface que contém o método x.
O ideal era postar sua necessidade do que explicar algo desse tipo.

Abraços.

J

nel:
Não vi uma classe que implementa sua interface e que faça com que tenha acesso ao método X.
Você pode ter acesso somente ao método em questão, de qualquer forma, precisas da classe que a implemente.

Posso ter visto com pressa, mas não vi nenhuma classe que extenda a interface WcAX, que é a interface que contém o método x.
O ideal era postar sua necessidade do que explicar algo desse tipo.

Abraços.

Com esta classe que esta me retornando os metodos certo nao sei se to viajado teria como por exemplo fazer alguma coisa do tipo Class<? extends WcAA> de retorno andei dando uma olha em codigo do tipo asssim tambem Class<? extends WcAA<? super T>>

public class WcAOperacao<WcAX> {
	public static Class<? extends WcAA<? super T>> wcaa() {
		return WcAA.class; //Teria que mudar este retorno tambem para dar certo
	}
}

Ok

nel

Você pode ter uma classe abstrata que implemente uma interface e que em seu método generico você obrigue que a classe passada seja filha dessa classe abstrata. Dessa forma, você obrigado que a classe filha implemente todos os métodos descritos na interface.

Mas é como eu disse, amigo, você pode executar de N formas o generics, se vai ou não estar correto, é uma coisa, se vai funcionar da forma como espera, é outra.
Porque não divide conosco a sua ncessidade? :slight_smile:

Abraços.

J

nel:
Você pode ter uma classe abstrata que implemente uma interface e que em seu método generico você obrigue que a classe passada seja filha dessa classe abstrata. Dessa forma, você obrigado que a classe filha implemente todos os métodos descritos na interface.

Mas é como eu disse, amigo, você pode executar de N formas o generics, se vai ou não estar correto, é uma coisa, se vai funcionar da forma como espera, é outra.
Porque não divide conosco a sua ncessidade? :slight_smile:

Abraços.

Minha necessidade e o seguinte estou desenvolvendo aqui um objeto que vai consumir determinados webservice entao tipo os modelo certificados sao comuns por exemplo em CT-e ou NF-e o A1 e A3 mais o menos que seria. tem como vc me mostrar um exemplo do que vc falou logo acima.

J

nel:
Você pode ter uma classe abstrata que implemente uma interface e que em seu método generico você obrigue que a classe passada seja filha dessa classe abstrata. Dessa forma, você obrigado que a classe filha implemente todos os métodos descritos na interface.

Mas é como eu disse, amigo, você pode executar de N formas o generics, se vai ou não estar correto, é uma coisa, se vai funcionar da forma como espera, é outra.
Porque não divide conosco a sua ncessidade? :slight_smile:

Abraços.

Sobre esta idea que vc deu funcionou caso tenha mais alguma dica para melhorar o codigo sera bem aceito.

//Classe Modificada
public interface WcAA<T> extends W {
	T wcaa(String s);
}
//Classe Modificada
public interface WcBB<T> extends W {
	T wcbb(String s);
}
//Classe Nova
public abstract class WcAAAbstract<T> implements WcAA {
	public T wcaa(String s) {
		return null;
	}
}
//Classe Nova
public abstract class WcBBAbstract<T> implements WcBB {
	public T wcbb(String s) {
		return null;
	}
}
//Classe Moficada
public class WcAOperacao<T extends WcAX> {
	public static Class<? extends WcAAAbstract<WcAX>> wcaa() {
		Class<? extends WcAAAbstract<WcAX>> clazz = null;
		return clazz;		
	}
	public static Class<? extends WcBBAbstract<WcAX>> wcbb() {
		Class<? extends WcBBAbstract<WcAX>> clazz = null;
		return clazz;		
	}
}

Resultado deste objeto:

wc.tipo(WcTipo.wca()).operacao(WcAOperacao.wcaa()).wcaa("guj").x();

Obrigado !!!
JVDS

nel

Oi!

E ai campeão, tudo certo?

Se você tem uma classe abstrata que implementa a interface, você não precisa declarar dentro dela os métodos da interface.
Somente uma classe concreta é obrigada a implementar os métodos declarados em uma interface. Se você realizar a implementação dos métodos da interface na classe abstrata, suas classes filhas não serão obrigadas a implementar tais métodos, pois os mesmo já estão implementadas na classe Pai, entende?

Dei a sugestão de criar uma classe abstrata pois obrigaria todas suas classes filhas a implementar os métodos descritos na interface e se você julgar necessário, podes criar método estaticos dentro dela ou até mesmo, outros métodos abstratos, que obrigariam o filho a implementar todos os métodos da interface e os que você declarar como abstrato dentro dela, consegue entender isso? É uma forma de você isolar sua necessidade e utilizando OO.

Fica ai a sugestão.
Você conseguiu entender o que quis dizer? :slight_smile:

Se precisar posto exemplo.
Abraços.

J

nel:
Oi!

E ai campeão, tudo certo?

Se você tem uma classe abstrata que implementa a interface, você não precisa declarar dentro dela os métodos da interface.
Somente uma classe concreta é obrigada a implementar os métodos declarados em uma interface. Se você realizar a implementação dos métodos da interface na classe abstrata, suas classes filhas não serão obrigadas a implementar tais métodos, pois os mesmo já estão implementadas na classe Pai, entende?

Dei a sugestão de criar uma classe abstrata pois obrigaria todas suas classes filhas a implementar os métodos descritos na interface e se você julgar necessário, podes criar método estaticos dentro dela ou até mesmo, outros métodos abstratos, que obrigariam o filho a implementar todos os métodos da interface e os que você declarar como abstrato dentro dela, consegue entender isso? É uma forma de você isolar sua necessidade e utilizando OO.

Fica ai a sugestão.
Você conseguiu entender o que quis dizer? :slight_smile:

Se precisar posto exemplo.
Abraços.

Blz cara obrigado ai pela dica teria como me mostrar um exemplo ai ja vou no caminho certo.

Ok

Obrigado !!!
JVDS

nel
[email removido:
]
nel:
Oi!

E ai campeão, tudo certo?

Se você tem uma classe abstrata que implementa a interface, você não precisa declarar dentro dela os métodos da interface.
Somente uma classe concreta é obrigada a implementar os métodos declarados em uma interface. Se você realizar a implementação dos métodos da interface na classe abstrata, suas classes filhas não serão obrigadas a implementar tais métodos, pois os mesmo já estão implementadas na classe Pai, entende?

Dei a sugestão de criar uma classe abstrata pois obrigaria todas suas classes filhas a implementar os métodos descritos na interface e se você julgar necessário, podes criar método estaticos dentro dela ou até mesmo, outros métodos abstratos, que obrigariam o filho a implementar todos os métodos da interface e os que você declarar como abstrato dentro dela, consegue entender isso? É uma forma de você isolar sua necessidade e utilizando OO.

Fica ai a sugestão.
Você conseguiu entender o que quis dizer? :)

Se precisar posto exemplo.
Abraços.

Blz cara obrigado ai pela dica teria como me mostrar um exemplo ai ja vou no caminho certo.

Ok

Obrigado !!!
JVDS

Opa! Não se trata de caminho certo, foi uma sugestão que eu acho adequada rs.
Segue exemplo:

public interface IExemplo {
    String getNome();
}

public abstract class AExemplo {
    public abstract int getIdade();
   
    public static long soma(long a, long b) {
        return a+b;
    }
}

public abstract class BExemplo {
   
}

public class ExemploA extends AExemplo {
   // método declarado na interface 
   public String getNome() {
       return "João da Silva";
   }
   // Método abstrato da classe Pai
   public int getIdade() {
       return 50;
   }
}

public class ExemploB extends BExemplo {
    // Método da interface
   public String getNome() {
       return jvds;
   }
}

Bom, o método declarado como static na classe abstrata AExemplo, é acessado como qualquer outro método/variavél estatica, ou seja:

AExemplo.some(10, 5);

Certo? Espero ter ajudado.
Abraços.

J

Valeu pelo exemplo vou queimar alguns neuronio que me resta qualquer coisa posto ai de novo.
Obrigado !!!
JVDS

J

Andei dando uma olhada e encrontei este link http://www.guj.com.br/java/125951-maneira-de-instanciar-uma-interface logico estou tomando NullPointer teria como instanciar realmente uma interface ?

rmendes08

Não, não há como instanciar uma interface. Você deve instanciar uma subclasse que implemente a interface.

Criado 7 de julho de 2011
Ultima resposta 9 de jul. de 2011
Respostas 13
Participantes 3