| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 14:53:19
|
rbarioni
GUJ Master
![[Avatar]](/images/avatar/c8ad096d3f3b756be66f6.gif)
Membro desde: 02/09/2002 10:49:11
Mensagens: 1317
Localização: Campinas
Offline
|
Fala turma.....
fiz meu sistema no jdk 1.3 e tudo certo....ai fui compila-lo no 1.4 e apareceu o seguinte erro:
frmConAtividade.java:2172: reference to compareTo is ambiguous, both method compareTo(java.util.Date) in java.util.Date and method compareTo(java.lang.Object) in java.sql.Timestamp match
como resolver essa ambiguidade gerada, q nao aparecia no 1.3??
valew
|
"Ozzy Osbourne pode ter inventado o heavy-metal, mas com certeza, Metallica o aprimorou." |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 18:24:22
|
Elvis.The.Pelvis
JavaGuru
![[Avatar]](/images/avatar/c8a589523f35508a5d7ec.jpg)
Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline
|
Analisando a classe Timestamp:
1 - Ela é filha de java.util.Date
2 - Por ser filha, ela herda "int compareTo(Date d)"
3 - A classe Timestamp agora tem três métodos compareTo:
int compareTo(Object o)
int compareTo(Date d) //vem a partir de herança
int compareTo(Timestamp ts)
Quando você faz:
O java não sabe se você quer chamar compareTo(Object) ou compareTo(Date)(herdada). Se compareTo(Date) fosse declarada explicitamente na classe Timestamp (ou se compareTo(Object) não fosse declarada e herdada também), não teria problemas.
Para resolver, use: (OOOOOPs se fizer isso dá ClassCastException)
Pois você chamará o método que aceita um Object como parâmetro, mas lançará ClassCastException
Faça então o inverso:
Isso é inédito para mim. Não sei por que o Java trata métodos herdados diferentemente dos métodos overriden. Descobri fuçando as classes e fazendo testes.
Alguém tem alguma idéia do por que disso.[/code]
|
Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 18:29:59
|
Elvis.The.Pelvis
JavaGuru
![[Avatar]](/images/avatar/c8a589523f35508a5d7ec.jpg)
Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline
|
No caso
Algo do tipo:
É até lógico que de erro, pois "b" tanto é filha de A (caindo no método dodo(a)) quanto implementa a interface I (caindo no método dodo(I)).
Agora no caso de Timestamp e Date, me surpreendeu realmente saber que os métodos que são herdados dão ambiguidade se não forem overriden explicitamente.
Já que "t.compareTo(d)" tenta se comparar com um objeto do tipo Date e o método compareTo(Date) existe, mesmo que vindo por herança, na minha cabeça teria que funcionar e não dar ambiguidade com compareTo(Object)
|
Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 19:10:00
|
Bani
JWizard
![[Avatar]](/images/avatar/6cdd60ea0045eb7a6ec44c54d29ed402.jpg)
Membro desde: 13/10/2002 23:17:37
Mensagens: 2443
Localização: São Paulo
Offline
|
Realmente estranho isso. Eu lembro que em uma palestra no TechDays foi dito que quando houvesse ambiguidade sobre qual método chamar (por exemplo, mandando null para um método overloaded que aceitaria vários tipos de objetos), o Java escolheria automaticamente o que fosse mais específica.
E agora também fiz meu próprio teste de métodos herdados e vi que realmente dá problema.
|
~ Site da Bani ~ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 19:36:00
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
creio que nem um, nem outro pessoal
APOSTO que voce esta passando NULL como argumento
this.compareTo(null)
posta a linha ai que da a ambiguidade
outra coisa, NUNCA escreva uma classe q tem esse numero enorme de linhas
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 19:43:36
|
Bani
JWizard
![[Avatar]](/images/avatar/6cdd60ea0045eb7a6ec44c54d29ed402.jpg)
Membro desde: 13/10/2002 23:17:37
Mensagens: 2443
Localização: São Paulo
Offline
|
A ambiguidade realmente existe. Veja esse exemplo:
public class Teste {
public static void main(String[] args) {
TesteFilho teste = new TesteFilho();
String t = "t";
teste.teste(t);
}
}
class TestePai {
public void teste(String teste) {
System.out.println("TestePai");
}
}
class TesteFilho extends TestePai {
public void teste(Object teste) {
System.out.println("TesteFilho");
}
}
Nesse caso, ao compilar dá a mensagem:
C:>javac Teste.java
Teste.java:6: reference to teste is ambiguous, both method teste(java.lang.String) in TestePai and method teste(java.lang.Object) in TesteFilho match
teste.teste(t);
^
1 error
Se fizer exatamente a mesma coisa colocando os dois métodos na classe pai, ele compila normalmente.
|
~ Site da Bani ~ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2003 19:55:40
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
eh o virtual method lookup do java... confusao... decidir qual dos overloadeds q ele vai usar deveria ser facilimo
e o mais engracado, esse codigo que a bani colocou, se voce inerter o metodo do pai com o filho, tambem compila. Isto eh, poe o obvject no pai, e o String no filho.
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/02/2003 07:16:28
|
rbarioni
GUJ Master
![[Avatar]](/images/avatar/c8ad096d3f3b756be66f6.gif)
Membro desde: 02/09/2002 10:49:11
Mensagens: 1317
Localização: Campinas
Offline
|
valeu pelas dicas pessoal...
resolvi o problema da ambiguidade fazendo um simples casting....
ai deu certo....
o estranho eh q no 1.3 tb tem essa heranca, mas nao dah erro algum......
falow
|
"Ozzy Osbourne pode ter inventado o heavy-metal, mas com certeza, Metallica o aprimorou." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/02/2003 11:49:22
|
Elvis.The.Pelvis
JavaGuru
![[Avatar]](/images/avatar/c8a589523f35508a5d7ec.jpg)
Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline
|
No chutômetro...
Uma classe filha possui
facaAlgo(Object)
facaAlgo(TipoPai) //essa vem da heranca
Quando a filha chama
facaAlgo(new TipoPai());
O Java sabe que ela se encaixa tanto em Object quanto em TipoPai. Só que como facaAlgo(TipoPai) é herdada e nãofoi declarada explicitamente o Java pode pensar.
"Essa chamada pode ser atendida pelos dois métodos. O correto é o método facaAlgo(TipoPai). Só que como ela veio através de herança, o sujeito pode não saber que ele existe e pensar que eu vou chamar facaAlgo(Object). Vou lançar uma exceção de ambiguidade para que ele tenha certeza do que ele está fazendo."
Será que é isso ou é alguma coisa que os desenvolcedores da linguagem deixaram passar desapercebido?
|
Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/02/2003 14:28:11
|
dukejeffrie
Virtual Machine Man
![[Avatar]](/images/avatar/c74d97b01eae257e44aa9d5bade97baf.png)
Membro desde: 21/08/2002 03:53:28
Mensagens: 661
Offline
|
Elvis, vc me fez lembrar de um problema idiota que eu tive há bastante tempo, com o método equals.
Tinha uma bosta de um equals herdado de object, que ele chamava sem eu querer. Se é essa a razão do erro, então achei ótimo aparecer isso.
Mas que eu saiba, o method lookup procura métodos na seguinte ordem:
1) métodos com argumento do mesmo tipo do parâmetro na classe to objeto (i.e, sem cast)
2) métodos com argumento de um supertipo do parâmetro na classe do objeco (i.e, upcast);
3) 1, 2 e 3 para a superclasse, se houver.
até não ter mais onde procurar.
Alguém que tá fazendo certificação e aprendeu direito isso pode explicar?? : ))
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/06/2008 07:55:40
|
gneves
What is classpath?
Membro desde: 23/04/2008 12:37:30
Mensagens: 8
Offline
|
Pessoal!
Estou com o mesmo problema do colega acima. E, mesmo com as dicas aqui não consegui resolver.
Será que alguém pode me ajudar?!?
The method compareTo(Date) in the type Date is not applicable for the arguments (Object)
238: int compare;
239: if(!Feriados.isEmpty()){
240: for(int x = 0; x < Feriados.size(); x++){
241: compare = data.compareTo(Feriados.get(x));
242: if(compare == 0){
243: Retorno = true;
244: break;
minha classe:
private boolean EFeriado( Vector Feriados, java.util.Date data){
boolean Retorno = false;
int compare;
if(!Feriados.isEmpty()){
for(int x = 0; x < Feriados.size(); x++){
compare = data.compareTo(Feriados.get(x));
if(compare == 0){
Retorno = true;
break;
}else if(compare < 0){
break;
}
}
}
return Retorno;
}
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/06/2008 09:19:51
|
setasan
What is classpath?
Membro desde: 23/04/2007 12:33:06
Mensagens: 7
Offline
|
Cara, na verdade vc só precisa fazer um cast.
compare = data.compareTo((Date)Feriados.get(x));
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/06/2008 09:34:23
|
gneves
What is classpath?
Membro desde: 23/04/2008 12:37:30
Mensagens: 8
Offline
|
então ..
quando eu faço o cast dessa forma, aí sim, dá erro de ambiguidade.
-The type date is ambiguous
This message was edited 1 time. Last update was at 11/06/2008 09:34:55
|
|
|
 |
|
|