Java Generics: requires generic to be a subclass of a certain type

I have an abstract generic class:

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;
    }
}

I need the general subclass to be a subclass of this class. In other words, generic must be a subclass of AbstractMessageHandler. This, however, gives me compilation issues. Can someone tell me what I'm doing wrong?

thank

+5
source share
3 answers

You need to follow the example of the Enum class:

public abstract class AbstractMessageHandler<T extends AbstractMessageHandler<T>>
+7
source

In your general definition, you can do <T extends SomeClass>

For instance:

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

In your case, it looks like this: it Tshould extend the class Response, not AbstractMessageHandler.

0
source

, , . ( , , ):

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;
    }
}

Or even better, just define an AbstractMessageHandler method that works with the current object. Then you do not need this static method, and you do not have this strange parameter that you always return.

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

All Articles