Почему бы не сделать это компилятором?
public interface F<A, B> {
public B $(A a);
}
Затем вы можете передать F<Double, Double>
методу, который ожидает F<? extends Number, ? extends Number>
.
EDIT:
Вы говорите, что хотите предоставить один класс для типа функции с любым количеством аргументов. Это можно сделать с помощью системы типов Java. Концептуально каждая функция имеет только один аргумент. Функция с двумя аргументами эквивалентна функции, которая возвращает другую функцию. Итак, вот переменная, значением которой является функция, которая принимает два двойных числа:
F<Double, F<Double, Double>> f;
Вот метод, который передает две двойные для данной функции:
public Double operate(F<Double, F<Double, Double>> f, double a, double b) {
return f.$(a).$(b);
}
Или рассмотрим тип L<A extends L>
с двумя подклассами C<E, T extends L<T>>
, представляющими «минусы», и тип терминатора N
:
public abstract class L<A extends L<A>> {
private L() {}
private static final N nil = new N();
public static N nil() {
return nil;
}
public static final class N extends L<N> {
private N() {}
public <E> C<E, N> cons(final E e) {
return new C<E, L>(e, this);
}
}
public static final class C<E, L extends L<L>> extends L<C<E, L>> {
private E e;
private L l;
private C(final E e, final L l) {
this.e = e;
this.l = l;
}
public E head() {
return e;
}
public L tail() {
return l;
}
public <E> C<E, C<E, L>> cons(final E e) {
return new C<E, C<E, L>>(e, this);
}
}
}
В таком случае вы можете реализовать тип функции таким образом:
public interface F<A extends L<A>, B> {
public B $(A args);
}
Следующий метод ожидает функцию с двумя Double
аргументами (и возвращает Double
) вместе с двумя double
с, чтобы применить ее к:
public Double operate(F<C<Double, C<Double, N>>, Double> f, double a, double b) {
return f.$(N.nil().cons(b).cons(a));
}
Реализация интерфейса F
должна была бы получить аргументы из списка, используя head
и tail
. По сути, вы реализуете LISP в Java. :)
Сказав это, посмотрите Функциональная Java , которая является библиотекой, в которой уже есть много этого. Я уверен, что есть еще один, который использует отражение, так что вам не нужно писать это самостоятельно.