Type Inference

4 respostas
ASOBrasil

Alguém sabe me explicar se o java tivesse “Type Inference” eu poderia transformar esse código:

Context jndi = getInitialContext( );
Object ref = jndi.lookup("MyBean/remote");
MyBeanRemote agent = (MyBeanRemote) PortableRemoteObject.narrow(ref, MyBeanRemote.class);

nesse, por exemplo?

Context jndi = getInitialContext( );
Object ref = jndi.lookup("MyBean/remote");
MyBeanRemote agent := PortableRemoteObject.narrow(ref, MyBeanRemote.class);

ou nesse, por exemplo?

Context jndi = getInitialContext( );
Object ref = jndi.lookup("MyBean/remote");
agent := PortableRemoteObject.narrow(ref, MyBeanRemote.class);

Ficaria melhor, concordam?

4 Respostas

Mauricio_Linhares

Considerando que a última chamada seria feita com inferência com base em genéricos e os genéricos do Java não existem no código compilado (isso aí na última linha viraria um cast) eu acho um tanto quanto complicado, mas não impossível.

Pra ter inferência de tipos com base em genéricos o Java precisaria de uma implementação de genéricos um pouco mais “real” e com menos gambiarras.

ASOBrasil

Maurício Linhares:
Considerando que a última chamada seria feita com inferência com base em genéricos e os genéricos do Java não existem no código compilado (isso aí na última linha viraria um cast) eu acho um tanto quanto complicado, mas não impossível.

Exatamenta! Isso dai acabaria virando um cast, mas em compensação seria mais performático que fazer isso em runtime, não?

Não entendi! Quais seriam as gambiarras na sua opinião e o que seria esse “um pouco mais real”?

mister_m

Tirando o “:”, isso já é possível fazer com generics, já que Class tem um método cast() : T.

Fazer isso seria possível com type inference sim. Já que você perguntou via PM como ficaria em Scala, seria algo como:

val agent = PortableRemoteObject.narrow[MyBeanRemote](ref)
T

Faltou fazerem a adaptação de javax.rmi.PortableRemoteObject para generics. Ela deveria ser:

public static <T> T narrow(Object narrowFrom,
                            Class<T> narrowTo)
                     throws ClassCastException

Assim poderíamos ter:

Context jndi = getInitialContext( );
Object ref = jndi.lookup("MyBean/remote");
MyBeanRemote agent = PortableRemoteObject.narrow(ref, MyBeanRemote.class);
Criado 6 de fevereiro de 2008
Ultima resposta 7 de fev. de 2008
Respostas 4
Participantes 4