Параметризация типа в Java (GADT) - PullRequest
1 голос
/ 10 января 2012

Мне нужно иметь такой тип GADT в Java, как

interface Action<C, O> {
    Collection<O> doAction(C<O> predicate)
}

так что я могу легко объявить класс как

class Selector<T> {
...
}

, а затем использовать его с реализацией Action, например, принимающей экземпляр Selector. И реализация Action также принимает Predicate - но тип аргумента должен соответствовать возвращаемому типу коллекции.

Основная идея состоит в том, чтобы один тип зависел от другого. Это возможно в простой старой Java 6?

1 Ответ

0 голосов
/ 07 марта 2012

Это не работает, потому что нет ничего принудительного, что C в Action<C, O> сам по себе является параметризованным типом. Например, вы можете объявить Action<String, Object> - и что тогда будет predicate? Нет такой вещи как String<Object>.

Не зная больше деталей, мне кажется, что вы хотите что-то более конкретное, например, определить Predicate<T> интерфейс:

interface Predicate<T> {
}

interface Action<C extends Predicate<O>, O> {
    Collection<O> doAction(C predicate);
}

class Selector<T> implements Predicate<T> {
}
...