A generic class that has another generic class as a parameter

I found myself in a strange situation with generics, and so far this is not possible. I tried to isolate the situation in simple classes. What I tried to execute was: a service class that sends descriptors for processing data packets. Each handler has a package type parameter because it is assumed that it will be a handler for each package. The service class also has a parameter of type Handler, since there are several types of handlers, so several services are required for different types of handlers. This description may not be entirely clear, so here is an example I made:

public abstract class Service<T extends Handler<?>> {

    //Some random logic

    //If only I could use T<E>
    protected abstract <E extends Packet> void handle(T handler, E packet);

}

public class ServiceImpl extends Service<HandlerOne<?>> {

    @Override
    protected <E extends Packet> void handle(HandlerOne<?> handler, E packet) {
        handler.handle("someString", packet); //ERROR
    }

}

public interface Handler<E extends Packet> {

}

public interface HandlerOne<E extends Packet> extends Handler<E> {

    void handle(Object someObject, E packet);

}

public class HandlerOneImpl implements HandlerOne<SomePacket> {

    @Override
    public void handle(Object someObject, SomePacket packet) {
    }

}

public interface Packet {

}

public class SomePacket implements Packet {

}

Is there any way to do something like this or any suggestions? Thanks

: - (: SomePacket PacketOne ). , , insing of ServiceImpl.

public static void main(String[] args) {
    HashMap<Class<? extends Packet>, HandlerOne<? extends Packet>> handlerMap = new HashMap<>();
    handlerMap.put(PacketOne.class, new HandlerOneImpl());

    ServiceImpl<Packet, HandlerOne<?>> s = new ServiceImpl<>(handlerMap);//ERROR
}

public static abstract class Service<E extends Packet, T extends Handler<E>> {

    Map<Class<? extends Packet>, T> handlerMap;

    public Service(Map<Class<? extends Packet>, T> handlerMap) {
        this.handlerMap = handlerMap;
    }

    //Some random logic

    //If only I could use T<E>
    protected abstract void handle(T handler, E packet);

}

public static class ServiceImpl<E extends Packet, T extends HandlerOne<E>> extends Service<E, T> {

    public ServiceImpl(Map<Class<? extends Packet>, T> handlerMap) {
        super(handlerMap);
    }

    @Override
    protected void handle(T handler, E packet) {
        handler.handle("someObject", packet);
    }

}
+4
2

handle Object E ( ). .

, Object - ?. :

public abstract class Service<E extends Packet, T extends Handler<E>> {
    // Some random logic

    protected abstract void handle(T handler, E packet);

}

public class ServiceImpl<E extends Packet, T extends HandlerOne<E>> extends Service<E, T> {
    @Override
    protected void handle(T handler, E packet) {
        handler.handle(new Object(), packet); // some object as first parameter
    }
}

:

protected <E extends Packet> void handle(HandlerOne<?> handler, E packet) {
    handler.handle("someString", packet); //ERROR
}

, "" , E. E.

+3

Java Type, , - . Java , , , () HighJ. HighJ Witness . , wiki.

, Java, - , , . " " , .

   List<String> we have something like 
   Something<List, String>.

, , (Java), . -.

(generics on generics) ( ,

   List<T extends Processor<E>> 

), , ( - -), ( , ).

.

0

Source: https://habr.com/ru/post/1608370/


All Articles