| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 12:40:34
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Esse código fala por si so:
go(x) vai chamar o método estático go(I arg), afinal a classe X implementa a interface I.
Agora a interface J é identica a I, o que impede que a classe X se comporte como J, ao menos em tempo de compilação? Isso seria mais custoso para o compilador ou poderia induzir a erros de modelagem/runtime/etc?
Afinal uma interface é um contrato, se o meu objeto respeita esse contrato...
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 12:43:46
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Você quer "duck typing" (ou seja, se anda como um pato, nada como um pato, grasna como um pato, então é um pato?)
O problema é que é difícil para a JVM (não exatamente para o compilador) investigar se 2 interfaces são idênticas, para o que você quer.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 12:55:10
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
peczenyj wrote:
Agora a interface J é identica a I, o que impede que a classe X se comporte como J, ao menos em tempo de compilação? Isso seria mais custoso para o compilador ou poderia induzir a erros de modelagem/runtime/etc?
Afinal uma interface é um contrato, se o meu objeto respeita esse contrato...
Vc está pensando que o contrato é apenas o conjunto dos métodos e suas assinaturas. Não é.
O contrato começa com o proprio tipo de interface.
Pense em Serializable por exemplo, que não tem métodos. A classe da interface é o contrato.
além da classe e métodos o contrato pode se extender ao que os métodos fazem. Como devem reagir etc.
Coisas que não são colocadas explciitamente na nterface. Por exemplo, Comparable , confronte o contrato dele com o de equals()
Se passar null em equals simplesmente retorna false, mas em Comparable deve lançar ClassCastException. Isso não tem como colocar no codigo da interface. So da implementação.
-----
Por outro lado se A tem a mesma interface que B vc pode facilmente criar proxies que transformem um no outro. A classe Proxy faz isso bem facilmente.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 12:56:20
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
É... pensei em duck typing.
Sem falar que nem precisariam ser interfaces identicas, bastaria ver se a classe X implementa tudo o que a interface requerida implementa.
Por um lado ONERA bastante a JVM, mas não compreendo se existe alguma outra impossibilidade de descobrir isso em runtime que esteja entranhado ao bytecode, etc.
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 12:58:39
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Acho que no JDk 7 você vai poder (não usando Java, é claro, mas outra linguagem qualquer) ter suporte a duck typing e outras coisas mais escabrosas (com aquele novo bytecode "invokedynamic").
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 13:24:07
|
urubatan
Moderador
![[Avatar]](/images/avatar/fe9fc289c3ff0af142b6d3bead98a923.jpg)
Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline
|
Ja que tu quer uma linguagem dinamica, programe em uma linguagem dinâmica.
É muito dificil, até mesmo quase impossível pelo motivo citado pelo sergiotaborda, implementar duck typing em uma linguagem estaticamente tipada.
mas tu pode simplesmente utilizar Groovy na JVM, a sitnaxe é muito parecida com Java, mas tu pode trabalhar com tipagem dinâmica e ter duck typing ...
|
[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2008 13:40:38
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Sem graça
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
|
|