4

私はジェネリックに関して奇妙な状況に陥っていることに気づきましたが、今のところそれは不可能のようです。単純なクラスで状況を分離してみました。私が達成しようとしていたのは、データのパケットを処理するためにハンドルをディスパッチするサービス クラスです。各ハンドラーには、パケットごとにハンドラーがあると想定されているため、パケットタイプのパラメーターがあります。ハンドラーにはいくつかのタイプがあるため、サービス クラスには Handler タイプのパラメーターもあります。そのため、ハンドラー タイプごとにいくつかのサービスが必要になります。この説明はあまり明確ではないかもしれないので、ここに私が作った例があります:

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 {

}

このようなことを達成する方法や提案はありますか? ありがとう

編集:これはmanoutiの回答から変更されたコードです(注:わかりやすくするために、SomePacketをPacketOneに変更しました)。私が遭遇した問題は、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 に答える 2