2010-04-19 10 views
1

récemment j'écris quelques fonctions que je prends de Haskell et traduisons en Java. L'un des principaux problèmes que j'ai est que je ne peux pas facilement créer une propriété statique avec un type générique. Laissez-moi vous expliquer par un petit exemple ...Existe-t-il une bonne façon d'avoir des paramètres génériques statiques Java?

// An interface to implement functions 
public interface Func<P, R> { 
    public R apply(P p); 
} 

// What I want to do... (incorrect in Java) 
public class ... { 
    public static <T> Func<T, T> identity = new Func<T, T>() { 
     public T apply(T p) { return p; } 
    } 
} 

// What I do right now 
public class ... { 
    private static Func<Object, Object> identity = new Func<Object, Object>() { 
     public Object apply(Object p) { return p; } 
    } 
    @SuppressWarnings("unchecked") 
    public static <T> Func<T, T> getIdentity() { 
     return (Func<T, T>)identity; 
    } 
} 

Y a-t-il des façons plus simples de faire quelque chose comme ça? Quels types de problèmes peuvent survenir si la syntaxe utilisée est valide?

Répondre

1

Il suffit de créer un nouveau petit objet chaque fois, pour une définition de "chaque fois". Rappelez-vous que les allocations sur les JRE typiques sont minimes, mais que les données statiques GCing sont chères. Alors que je pense que votre syntaxe pourrait être faite pour fonctionner sans problèmes de compatibilité, ce serait ajouter de la complexité et de l'irrégularité tout en n'apportant pas énormément de bénéfices.

0

Je pense que la façon dont vous le faites actuellement est la plus facile que vous allez trouver. Le problème est dû à la façon dont la plate-forme Java implémente les génériques en interne - puisqu'elle utilise l'effacement de type (pour des raisons de rétrocompatibilité), les informations de type sont perdues au moment de la compilation et empêche l'utilisation des génériques dans des situations comme les déclarations statiques. car ces types de déclarations requièrent généralement que les informations de type soient compilées (ce que Java ne fait pas actuellement pour Generics).

+0

Ici, il n'est pas nécessaire d'avoir des informations de type lors de l'exécution. – Kru

+0

Vrai, mais je pense que du point de vue du compilateur Java, c'est comme essayer de faire "public static T foo = new T()" ce qui n'est pas possible en raison du type effacement (qui serait traduit par "public static foo = new Object() "... ce qui n'est certainement pas juste). – BCunningham