Generi c Класс в зависимости от других Generi c Класс. Как убедиться, что нет непроверенного назначения - PullRequest
0 голосов
/ 11 марта 2020
public interface Dao<T> {
    Optional<T> getAllBins(UUID id) throws DaoException;
    void save(T t, byte[] key);
}


public class ADao<T> implements Dao<T> {
    private Codec<T, Map<String, byte[]>> codec;
    Client client;

    public ADao(Client client, Codec<T, Map<String, byte[]>> codec) {
        this.codec = codec;
        this.client = client;
    }

    @Override
    public Optional<T> getAllBins(UUID id) throws DaoException {
        return codec.decode(id, client.get(id));
    }

    @Override
    public void save(T t, byte[] key) {
        Optional<Map<String, byte[]>> encodedValues = codec.encode(t);
        for (Map.Entry<String, byte[]> entry : encodedValues.get().entrySet()) {
            client.put(entry.getKey(), entry.getValue());
        }
    }
}

У меня есть универсальный c интерфейс Dao, реализованный классом generi c. Общий c класс ADao зависит от универсального c кода интерфейса c.

public interface Codec<T,W> {
    public Optional<W> encode(T object);
    public Optional<T> decode(UUID key,  W object);

}

public class ACodecImpl implements Codec<IdGraph, Map<String, byte[]>> {
    @Override
    public Optional<Map<String, byte[]>> encode(IdGraph graph) {
        return Optional.of(encodeGraph(result));
    }

    @Override
    public Optional<IdGraph> decode(UUID key, Map<String, byte[]> bytes) {
        return Optional.of(decodeToGraph(key, bytes));
    }
}

В приведенном ниже Main классе

    class Main{
    public static void main(String[] args) {
        Client client = new Client();
        Codec codec =  new ACodecImpl();
        Dao dao = new ADao<IdGraph>(client, codec); //Gives warning unchecked assignment for codec
    }

}

В основном Метод основного класса, я получаю предупреждение. непроверенное назначение. Мне было интересно, есть ли лучший дизайн, с помощью которого я могу избежать непроверенного назначения, или это достойный дизайн для того, чего я пытаюсь достичь (отделяя логи кодирования / декодирования c от Dao).

...