2010-04-19 2 views
1

Недавно я пишу некоторые функции, которые я беру из Haskell и переводил на Java. Одна из основных проблем, которые у меня есть, я не могу легко создать статическое свойство с общим типом. Позвольте мне объяснить небольшим примером ...Есть ли хороший способ иметь статические общие параметры 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; 
    } 
} 

Есть ли какие-либо более простые способы сделать что-то подобное? Какие проблемы могут возникнуть, если синтаксис, который я использовал, будет действительным?

ответ

1

Просто создайте новый крошечный маленький объект каждый раз, для некоторого определения «каждый раз». Помните, что распределение по типичным JRE является крошечным, но статические данные GCing дороги.

Хотя я думаю, что ваш синтаксис можно было бы работать без проблем совместимости, это было бы сложностью и нерегулярностью, не принося огромной суммы в пользу.

0

Я думаю, что способ, которым вы сейчас занимаетесь, - это самое легкое, что вы найдете.

Проблема связана с тем, как платформа Java реализует Generics внутренне - поскольку она использует стирание типа (для соображений обратной совместимости), информация о типе теряется во время компиляции и предотвращает использование Generics в ситуациях, таких как статические объявления, поскольку эти виды объявлений обычно требуют, чтобы информация о типе была скомпилирована (что Java в настоящее время не будет делать для Generics).

+0

Здесь нет необходимости иметь информацию о типе во время выполнения. – Kru

+0

Верно, но я думаю, что с точки зрения компилятора Java это похоже на попытку сделать «public static T foo = new T()», что невозможно из-за стирания типа (которое эффективно переводится как «public static foo = new Object() «... что определенно не так). – BCunningham

Смежные вопросы