2010-11-04 5 views
3

Je veux faire quelque chose le long des lignes de (notez que je sais que cela ne fonctionne pas, mais ma question est de savoir s'il est possible le faire fonctionner):Puis-je appeler une méthode java statique en utilisant le typage structurel?

object O { 
    def main(args: Array[String]) { 
    val clazzname = classOf[System].getName 
    val c = Class.forName(clazzname).asInstanceOf[{def currentTimeMillis: Long}] 
    c.currentTimeMillis 
    } 
} 

Est-ce possible? (sans utiliser de réflexion)

Le cas d'utilisation réel est la lecture de messages protobuf sérialisés.

+0

Vous avez une réponse sur la liste de diffusion scala-users: http://scala-programming-language.1934581.n4.nabble.com/Structural-types-and-static-java-methods-td3026795.html#a3026795 –

Répondre

2

En bref: Non

Je souhaite qu'il y ait une meilleure réponse, mais comme vous pouvez déjà le voir dans la liste de diffusion, ce n'est pas (actuellement) possible. Espérons que la situation s'améliorera à mesure que le soutien de la réflexion native à Scala arrivera à maturité.

0

Est-ce que ce travail pour vous:

val c = new {      
    def cm = System.currentTimeMillis 
} 

noter Cependant, les types de structure interne utilisent la réflexion.

+0

Non , il wouldnt, je reçois le nom de la classe comme une chaîne, alors j'ai besoin d'appeler la méthode currentTimeMillis (ou parseFrom dans l'exemple GPB) sur la classe chargée en utilisant Class.forName –