Есть ли хороший способ иметь статические общие параметры в Java? - PullRequest
1 голос
/ 19 апреля 2010

В последнее время я пишу некоторые функции, которые я использую в Haskell и перевожу на 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;
    }
}

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

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

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

0 голосов
/ 19 апреля 2010

Я думаю, то, что вы сейчас делаете, - это самое простое, что вы найдете.

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

...