Type Inference

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?

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.

[quote=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.
[/quote]
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”?

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)

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);