| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/07/2006 20:13:24
|
Alexandre Gazola
JavaTeenager
![[Avatar]](/images/avatar/07845cd9aefa6cde3f8926d25138a3a2.jpg)
Membro desde: 23/07/2004 14:48:23
Mensagens: 176
Localização: Rio de Janeiro
Offline
|
Pessoal,
o seguinte código:
1.Class x {public int[] getContents() { return new int[]{1,2,3};}
2.
3.Class cls = Class.forName(x);
4.Method meth = cls.getMethod("getContents", null);
O Eclipse informa esse warning relativo a linha 4:
"The argument of type null should explicitly be cast to Class[] for the invocation of the varargs method getMethod(String, Class...) from type Class. It could alternatively be cast to Class for a varargs invocation"
Tipo, pelo fato de o método getMethod da classe Class ter essa assinatura: public Method getMethod(String name, Class... parameterTypes), com o segundo parâmetro sendo do tipo varargs, não seria aconselhável eu passar simplesmente um null. O certo seria eu fazer
Method meth = cls.getMethod("getContents", (Class[]) null); ou
Method meth = cls.getMethod("getContents", (Class) null);
Mas eu não entendi porque isso é recomendável!
Alguém pode dar algum esclarecimento?
Obrigado
|
Alexandre Gazola
Blog: http://alexandregazola.wordpress.com
"Que proveito tem o homem ganhar o mundo inteiro e perder a sua alma?" (Mc. 8:36)
"Buscai, em primeiro lugar, o Reino de Deus e a sua justiça, e todas essas coisas vos serão dadas por acréscimo" (Mt. 6:33) |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2006 10:17:30
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
No seu caso, você deveria passar (estilo antigo, e mais compreensível):
ou
uma vez que você está indicando a getMethod que quer um método "getContents" que não tenha argumentos.
Segundo o JavaDoc de getMethod, é possível passar "null" para indicar um array vazio. Só que qual null?
Passar (Class)null tem o efeito de passar um array de Class com exatamente 1 elemento (null).
Passar (Class[])null tem o efeito desejado no JavaDoc, ou seja, passar um null que é um array de Class.
Eu passaria "new Class[0]" embora isso requeira a criação de um objeto, porque também pode ser "back-ported" para versões mais antigas do Java.
O que é muito mais simples, no entanto, é não passar nada; isso equivale a passar new Class[0].
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2006 13:17:41
|
Alexandre Gazola
JavaTeenager
![[Avatar]](/images/avatar/07845cd9aefa6cde3f8926d25138a3a2.jpg)
Membro desde: 23/07/2004 14:48:23
Mensagens: 176
Localização: Rio de Janeiro
Offline
|
Eu só nao entendi ainda qual é o perigo de se passar null como argumento para um parâmetro varargs... Passar null para um método que receba um array é permitido sem nenhum problema.
Outro esclarecimento:
getMethod("xxx", new Class[0]) é exatamente igual a getMethod("xxx", (Class[]) null) ???
No Java antigo, ambos funcionam.
|
Alexandre Gazola
Blog: http://alexandregazola.wordpress.com
"Que proveito tem o homem ganhar o mundo inteiro e perder a sua alma?" (Mc. 8:36)
"Buscai, em primeiro lugar, o Reino de Deus e a sua justiça, e todas essas coisas vos serão dadas por acréscimo" (Mt. 6:33) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2006 13:25:47
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
a) null para varargs é intrinsecamente ambíguo - se houver vários métodos com assinaturas diferentes - tanto é que o código que o javac gerou manifesta isso.
b) new Class[0] é um objeto do tipo Class[], enquanto (Class[]) null é um objeto null, que como sabemos pertence a todas as classes.
No Java antigo, ambos funcionam porque o Javadoc de getMethod diz explicitamente isso - ou seja, que "null" é aceito como parâmetro; se você definisse o seu próprio método com varargs, provavelmente você teria problemas.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2006 13:27:25
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Não tenho a nova versão do "Effective Java", mas provavelmente isso (que é um novo warning que também aparece com o javac da versão 6.0 - Mustang) é algo que deve ser visto.
(Acho que essa é uma "ponta solta" que deixaram na especificação).
|
|
|
 |
|
|
|
|