Java泛型:要求泛型成为某种类型的子类

时间:2012-09-27 18:52:35

标签: java generics

我有一个抽象的泛型类:

public abstract class AbstractMessageHandler<T extends AbstractMessageHandler>
{
    public abstract List<String> getTypesOfMessages();
    public abstract void handleMessage(String message, CometClient client);

    public T setResponseValues(AbstractMessage request, T response )
    {
        response.setCompanyId(request.getCompanyId());
        response.setMessageGroup(request.getMessageGroup());
        response.setUserId(request.getUserId());
        response.setTimeStamp(AbstractMessage.getCurrentTimeStamp());

        return response;
    }
}

我需要将泛型子类作为此类的子类。换句话说,泛型必须是AbstractMessageHandler的子类。然而,这给了我编译问题。谁能让我知道我做错了什么?

由于

3 个答案:

答案 0 :(得分:8)

您需要遵循Enum类的示例:

public abstract class AbstractMessageHandler<T extends AbstractMessageHandler<T>>

答案 1 :(得分:0)

在通用定义中,您可以执行<T extends SomeClass>

例如:

abstract class Processor<T extends String> {
    abstract T process();
}

在您的情况下,似乎T应该扩展某些Response类,而不是AbstractMessageHandler

答案 2 :(得分:0)

从给出的代码来看,似乎没有必要使该类具有通用性。如何改为使用泛型方法(我甚至将它设置为静态,因为它似乎根本不需要使用当前对象):

public abstract class AbstractMessageHandler
{
    public static <T extends AbstractMessageHandler> T setResponseValues(AbstractMessage request, T response )
    {
        response.setCompanyId(request.getCompanyId());
        response.setMessageGroup(request.getMessageGroup());
        response.setUserId(request.getUserId());
        response.setTimeStamp(AbstractMessage.getCurrentTimeStamp());

        return response;
    }
}

或者甚至更好,只需在AbstractMessageHandler上定义一个对当前对象进行操作的方法。那么你不需要这个静态方法,并且你没有总是返回的这个奇怪的参数。

public abstract class AbstractMessageHandler
{
    public void setResponseValues(AbstractMessage request)
    {
        setCompanyId(request.getCompanyId());
        setMessageGroup(request.getMessageGroup());
        setUserId(request.getUserId());
        setTimeStamp(AbstractMessage.getCurrentTimeStamp());
    }
}