Сегодня я столкнулся с небольшой проблемой. Рассмотрим небольшой класс-оболочку:
Код: Выделить всё
class Event {
T value;
Class type;
// other fields, getters and setters omitted for brevity
}
Теперь я оказался в ситуации, когда мне хотелось преобразовать Event в Event, сохранив при этом другие поля и обновив элемент type.
В конце концов я нашел самое простое «решение»:
Код: Выделить всё
Event new = new Event(old.getValue().toString(), String.class, other, fields);
Однако, работая с Haskell над моими любимыми проектами, я, естественно, жаждал функции типа fmap :: Functor f => (a -> b) -> f a -> f b (читай: учитывая функцию от a до b и функтор, содержащий что-то типа a, я получаю результат, содержащий b), и, не найдя стандартной реализации, я решил написать ее сам:
Код: Выделить всё
interface Functor {
Functor fmap( Func1 f );
}
// ... in Event:
Functor fmap( Func1 f ) {
S newValue = f.call(this.value);
return new Event( newValue, newValue.getClass(), other, fields);
}
Теперь с этим решением возникает проблема: после вызова fmap в Java у меня остается экземпляр типа Functor, в то время как та же функция в Haskell возвращает Event.
Есть ли способ вернуть мое событие (без его небезопасного приведения)?>
Подробнее здесь:
https://stackoverflow.com/questions/229 ... rt-in-java