Java Generics, расширенные Generics и абстрактные классы - PullRequest
5 голосов
/ 07 июня 2009

У меня настроены следующие классы:

public abstract class Process<T,S> {
    ...
}

public abstract class Resource<T, S extends Process<T, S>> {
    protected S processer;
    ...
}

public class ProcessImpl<EventType1, EventType2> {
    ...
}

public class ResourceImpl extends Resource<EventType1, ProcessImpl> {
    processer = new ProcesserImpl();
    ...
}

Все хорошо, пока я не доберусь до ResourceImpl. Мне сказали, что ProcessImpl не является допустимой заменой ограниченного параметра <S extends Process<T,S>> типа Resource<T,S>.

Я пробовал разные способы обойти это и продолжать бить стену.

У кого-нибудь есть идеи?

Ответы [ 4 ]

11 голосов
/ 07 июня 2009
public class ProcessImpl<EventType1, EventType2> {
...
}

Поскольку ProcessImpl не расширяет Процесс. Ваш ProcessImpl не является производным от Process, и вы заявляете, что этот параметр должен быть.

1 голос
/ 07 июня 2009

Возможно, вы захотите сделать что-то вроде этого:

public abstract class Process<T, S> {
}

public abstract class Resource<T, S extends Process<T, S>> {
    S processor;

}

public class ProcessImpl extends Process<EventType1, ProcessImpl> {
}

public class ResourceImpl extends Resource<EventType1, ProcessImpl> {

}

Если вы ограничите параметр S в Resource как процессор, вам также необходимо правильно объявить его в классе ProcessImpl. Я не знаю, что такое EventType2, но он должен реализовывать интерфейс процесса. Я предположил, что вы на самом деле хотите сказать ProcessImpl.

0 голосов
/ 07 июня 2009

Если вы не хотите, чтобы ваш код зависел от какого-то существующего пакета, который содержит Process, вы также можете ввести новый интерфейсный пакет, не зависящий ни от чего в самом низу иерархии классов. (Если вы можете изменить ограничения наследования, конечно.)

0 голосов
/ 07 июня 2009

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

Этот код будет существовать на веб-уровне, тип события2 определен на постоянном уровне и доступен только на основном уровне, который существует ниже этого уровня.

Так что, к сожалению, без жесткой связи, которой я бы хотел избежать, у меня нет доступа к EventType2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...