Implicity Interface  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
peczenyj
Moderador
[Avatar]

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.'
[WWW]
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.
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

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
[WWW]
peczenyj
Moderador
[Avatar]

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.'
[WWW]
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").
[WWW]
urubatan
Moderador
[Avatar]

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
[WWW]
peczenyj
Moderador
[Avatar]

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.'
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team