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

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

public abstract class XMLSubscription <T extends XMLMessage>

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

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

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage>
{
   public Class <XMLStatusMessage> getExpectedMessageType()
   {        
     return XMLStatusMessage.class;
   }
}
11.12.2008 22:37:15
Можете ли вы изменить название вопроса, чтобы оно больше отражало ваш общий вопрос? Например, вы можете указать универсальный тип, который расширяет класс, или ... что-то подобное? Кто-то ищет что-то похожее на это, вам не поможет название вопроса.
mmcdole 11.12.2008 22:45:28
Возможно "Могу ли я вернуть тип класса Java Generic?"
Greg Case 11.12.2008 22:46:39
Хорошие предложения, я не мог придумать, как сформулировать вопрос, спасибо!
darrickc 11.12.2008 23:03:26
2 ОТВЕТА
РЕШЕНИЕ

К сожалению - и да, это связано с удалением типа - нет способа вернуть 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);
    }
}
4
11.12.2008 22:45:43
Фантастический! Ваше решение экономит мне немного кода и много документации / объяснений! Хороший обходной путь!
darrickc 11.12.2008 23:09:01

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

public Class<T> getExpectedMessageType()

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

0
11.12.2008 22:51:06
Чтобы сформулировать вопрос, мне пришлось вырезать много кода и переместить его. Фактический код реализует шаблон Visitor, как вы рекомендуете. Тип фактически передается в метод Castor, чтобы он знал, как демаршировать объект Java.
darrickc 11.12.2008 23:07:47