2012-01-10 2 views
0

мне нужно иметь так вроде GADT в Java, кактипа параметризирующего в Java (GADT)

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

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

class Selector<T> { 
... 
} 

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

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

+0

я не уверен, что я следую. Вы можете определить 'Action' как' Action > ', я думаю (хотя вы могли бы также использовать' C' для типа 'предикат'). Java, как и большинство языков, не поддерживает более высокие типы заказов. –

+0

@ TomHawtin-tackline Действие > Недопустимое определение. – jdevelop

+0

Вы можете не только потому, что C является общим, вы не можете гарантировать, что C является общим типом O. Вы можете указать, что C продолжается от определенного класса или реализует определенный интерфейс, который может содержать O. Можете ли вы предоставить дополнительную информацию о C, O ? – Cromat

ответ

0

Это не работает, потому что нет ничего, что обеспечивало бы то, что 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> { 
} 
Смежные вопросы