| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2007 10:41:53
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Olá!
Estou utilizando uma fábrica que utiliza reflection para criar implementações específicas da interface Manager. Manager é uma interface genérica parametrizada (utiliza type parameter).
ManagerFactory é uma fábrica de implementações específicas de Manager's que estão de acordo com um certo tipo de Entity.
O problema é que essa fábrica não específica o o parâmetro de tipo para Manager. Então, ao invés de retornar
ela retorna apenas
E isso é péssimo, pois eu perco as vantagens de usar Generic, que é type safety, e ganho uns três bilhões de warnings por todo o código.
Alguma luz?
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2007 11:39:32
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Mude a assinatura para
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2007 17:40:34
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Valeu, Taborda.
A assinatura ficou assim:
Mas mesmo assim continuo tendo as mesmas advertências graças à:
Será que há como colocar parâmetro de tipo numa instância criada por reflection?
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 08:31:08
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
RafaelRio wrote:
Mas mesmo assim continuo tendo as mesmas advertências graças à:
Sem o resto do codigo fica difficil, por exemplo, que tipo é domainManagerClass ?
Se for Manager<E> o domainManagerClass.newInstance() deve retornar Manager<E> tb.
Tb tens que declarar <E> em todos os Manager dentro do método como em
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 14:30:13
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
sergiotaborda wrote:Tb tens que declarar <E> em todos os Manager dentro do método como em
Eu fiz isso, Taborda.
A pedido, segue o código inteiro (mas creio que as outras partes não são muito relevantes).
Quando instancio um Manager via reflection, eu ainda obtenho um Manager sem parâmetro de tipo:
found : capture#7 of ? extends iboi.domain.service.manager.Manager
required: iboi.domain.service.manager.Manager<E,java.lang.Long>
domainManager = domainManagerClass.newInstance();
Como visto, domainManagerClass é apenas uma instância de Class<? extends Manager>.
Alguma idéia?
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 17:36:54
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Class <? extends Entity> não serve. Experimenta
Não podes usar '?'. O que tu queres é vincular todos os tipos Manager à entidade que passas com o argumento e que é referenciada por E.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 18:06:37
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
sergiotaborda wrote:Class <? extends Entity> não serve. Experimenta
Não podes usar '?'. O que tu queres é vincular todos os tipos Manager à entidade que passas com o argumento e que é referenciada por E.
Isso não vai dar certo, Taborda. domainManagerClass é uma instância de Class, não de Manager.
Eu uso a anotação ManagerClass na entidade pare definir qual o seu Manager. <EDITADO> Isto é, qual a sua classe Manager, e não uma instância dessa classe. A instância eu quero obter pela factory. </EDITADO>
<EDITADO value="de novo">Onde você viu Class <? extends Entity> ??</EDITADO>
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 18:40:40
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
RafaelRio wrote:
Isso não vai dar certo, Taborda. domainManagerClass é uma instância de Class, não de Manager.
coloque
E troque domainManagerClass para Class<Manager><E,Long>>
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 19:35:34
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Boa sugestão!
Fiz as mudanças sugeridas, mas ainda não funcionou. Ao invés de warnings, estou com erro agora.
value em ManagerClass ficou um pouco diferente do que você propos para poder funcionar.
Class<Manager><? extends Entity, Long>> faz mais sentido do que Class<? extends Manager> , que era como estava antes.
De novo, Class<Manager><E, Long>> domainManagerClass... está mais exato do que antes, Class<? extends Manager> domainManagerClass...
Porém,
compilador wrote:found : java.lang.Class<capture#886 of ? extends iboi.domain.service.manager.Manager><? extends iboi.domain.Entity,java.lang.Long>>
required: java.lang.Class<iboi.domain.service.manager.Manager><E,java.lang.Long>>
domainManagerClassAnnotation.value();
O compilador está embaçando com o <E extends Entity> na assinatura de getManager, dizendo que é diferente do <? extends Entity> de value em ManagerClass.
Pra mim era óbvio que as duas coisas são o mesmo, mas o mundo (e a JDK) não são cheios de surpresas?
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2007 22:56:28
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
RafaelRio wrote:Porém,
compilador wrote:found : java.lang.Class<capture#886 of ? extends iboi.domain.service.manager.Manager><? extends iboi.domain.Entity,java.lang.Long>>
required: java.lang.Class<iboi.domain.service.manager.Manager><E,java.lang.Long>>
domainManagerClassAnnotation.value();
O compilador está embaçando com o <E extends Entity> na assinatura de getManager, dizendo que é diferente do <? extends Entity> de value em ManagerClass.
Pra mim era óbvio que as duas coisas são o mesmo, mas o mundo (e a JDK) não são cheios de surpresas?
Agora ficou mais claro o porquê disso. O parâmetro de tipo em <E extends Entity> de getManager pode ser diferente do parâmetro de tipo em <? extends Entity> de ManagerClass. Isso estava na minha cara! O compilador não tem como verificar duas coisas diferentes que vão ser definidas em tempo de execução.
O erro eu solucionei com Class<? extends Manager> domainManagerClass.... Ou seja, de volta a estaca zero.
Será que tem jeito?
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/08/2007 09:25:22
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Aehh!! Não é que tem jeito?!
Pra fazer funcionar declarei
e incializei com a factory invocando o método com o argumento de tipo
A idéia é pedir "me dê um gerenciador para tal entidade", assim o cliente não precisa saber quem é a implementação do manager para tal entidade. Esses detalhes ficam com a factory. Ao mesmo tempo, usar classes genéricas, seguir o mantra open for extension, closed for modification e utilizar reflection na factory para evitar montes de if/elses.
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/08/2007 12:41:51
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
RafaelRio wrote:Aehh!! Não é que tem jeito?!
Parabéns. Desculpe não ter continuado o dialogo , mas estou meio sem tempo. Vc reparou que usa um Long como tipo generico fixo (ou seja, é sempre um long e não extends Long) ? Isso significa que na realidade isso é um tipo estático
Se as suas chaves são sempre Long não precisa definir o tipo como generico.
Em opção elas podem ser de uma certa interface. vc usa essa interface estáticamente e pode implementá-la com Long ou qq outro objeto. Pense nisso...
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/08/2007 14:32:04
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
sergiotaborda wrote:Parabéns. Desculpe não ter continuado o dialogo , mas estou meio sem tempo.
Tranqüilo, Taborda! Mesmo porque ainda não está tudo resolvido (diria que 50%) apesar das minhas vibrações. O cliente que usa a factory está ok. No entanto, ainda estou com problemas em mapear o manager da anotação para a fábrica e instanciar o manager correto via reflection (isso eu ainda não sei se tem jeito) . Também tenho que arranjar outra forma de declarar e inicializar o cache.
sergiotaborda wrote:Vc reparou que usa um Long como tipo generico fixo (ou seja, é sempre um long e não extends Long) ? Isso significa que na realidade isso é um tipo estático
Se as suas chaves são sempre Long não precisa definir o tipo como generico.
Tava achando estranho você não ter comentado ainda sobre isso. Eu taquei Long aí pra simplificar, mas vou ter que definir qual o tipo da chave primária também.
A verdade é que eu ainda não decidi exatamente o que fazer com a chave primária. Se eu seguir sua sugestão, todas as entidades terão que ter ID tipo Long; se eu precisar definir o tipo como argumento na factory, terei que expor os clientes a esse tipo de detalhe...
Mas isso é o de menos agora, não estou preocupado. A prioridade é fazer a coisa funcionar direito (eliminar todos os warnings), e, conforme eu for progredindo, eu escrevo aqui. É claro que estou interessado em sugestões!
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
|
|