Можно ли написать метод, который возвращает объект класса T? - PullRequest
2 голосов
/ 12 декабря 2008

Если у меня есть базовый класс такой, что

public abstract class XMLSubscription <T extends XMLMessage>

Можно ли написать метод в XMLSubscription, который возвращает объект класса T?

Единственное возможное решение, которое я придумал, - это чтобы у каждого потомка XMLSubscription был такой метод:

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage>
{
   public Class <XMLStatusMessage> getExpectedMessageType()
   {        
     return XMLStatusMessage.class;
   }
}

Ответы [ 2 ]

4 голосов
/ 12 декабря 2008

К сожалению - и да, это связано с удалением типа - невозможно вернуть объект Class, не предоставив его во время выполнения.

К счастью, обычно это не так уж сложно. Вот как я обычно это делал / видел, как это делается:

public abstract class XMLSubscription <T extends XMLMessage> {
    private Class<T> messageType;

    protected XMLSubscription(Class<T> messageType) {
        this.messageType = messageType;
    }

    public Class<T> getExpectedMessageType() {
        return this.messageType;
    }
}

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> {

    public XMLStatusSubscription() {
        super(XMLStatusMessage.class);
    }
}
0 голосов
/ 12 декабря 2008

Как вы уже догадались, T стирается компилятором. Когда вы создаете экземпляр объекта, он понятия не имеет, что должен иметь дело с XMLStatusMessage объектами. Ваш базовый класс определит следующий шаблонный метод, а ковариантные возвращаемые типы 1.5 будут удовлетворять компилятор конкретными подклассами:

public Class<T> getExpectedMessageType()

Существует один мета-комментарий: он очень похож на процедурный код, где что-то вызывает getExpectedMessageType () , а затем выполняет действие на основе типа возвращаемого значения. Это может быть лучше реализовано с использованием шаблона Visitor, когда посетитель реализует методы "doSomething" для каждого из подклассов XMLMessage .

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